เข้าถึงดัชนีองค์ประกอบอาเรย์ ES6 ภายในวงรอบ


228

เราสามารถเข้าถึงองค์ประกอบต่างๆโดยใช้ for-of loop:

for (const j of [1, 2, 3, 4, 5]) {
  console.log(j);
}

ฉันจะแก้ไขรหัสนี้เพื่อเข้าถึงดัชนีปัจจุบันได้อย่างไร ฉันต้องการที่จะบรรลุสิ่งนี้โดยใช้สำหรับไวยากรณ์ของทั้งสำหรับแต่ละหรือใน

คำตอบ:


351

การใช้Array.prototype.keys:

for (const index of [1, 2, 3, 4, 5].keys()) {
  console.log(index);
}

หากคุณต้องการเข้าถึงทั้งกุญแจและค่าคุณสามารถใช้Array.prototype.entries()กับการทำลายล้าง :

for (const [index, value] of [1, 2, 3, 4, 5].entries()) {
  console.log(index, value);
}


64
ในสิ่งมหัศจรรย์คนกรณีที่ผมทดสอบfor-ofด้วยและก็เป็นสองเท่าเมื่อเทียบกับช้า.entries() jsperf.com/for-of-vs-foreach-with-index.forEach()

1
@ K48 ดีใจที่ได้รู้ใช้ "reversed for-loop" ถ้าคุณต้องการมีความเร็วที่เร็วที่สุดใน es: เหลือเชื่อ
-web.com/blog/…

3
น่าเสียดายที่ฉันต้องการผลผลิตจากภายในลูปซ้อนกัน ไม่สามารถใช้ forEach ได้เนื่องจากฟังก์ชันสร้างปัญหาขอบเขตสำหรับyieldคำหลัก แต่ฉันต้องการเข้าถึงดัชนีสำหรับกรณีการใช้งานของฉันดังนั้น ... ;;ลูปเก่าแบบพื้นฐานคือฉันเดา
Kyle Baker

2
@ KyleBaker และเกิดอะไรขึ้นกับ for-of loop ด้วย.entires()?
MichałPerłakowski

1
คุณสามารถแคชความยาวได้แทน jsperf.com/reverse-loop-vs-cacheแทน สำหรับการใช้งานที่มีประโยชน์สำหรับการประมวลผลที่ทำซ้ำได้เมื่อคุณสามารถประมวลผลสตรีมโดยไม่ต้องสร้างอาร์เรย์ขนาดใหญ่ใน RAM ความเร็วลูปจะไม่เป็นคอขวดเนื่องจากคุณจะมีเวลาแฝง I / O ในกรณีเช่นนี้
x'ES

289

Array#entries ส่งคืนดัชนีและค่าหากคุณต้องการทั้งสอง:

for (let [index, value] of array.entries()) {

}

3
ด้วย TypeScript: 'TS2495: Type IterableIterator ไม่ใช่ประเภทอาร์เรย์หรือชนิดสตริง' ดูเหมือนว่าสิ่งนี้จะได้รับการแก้ไข: github.com/Microsoft/TypeScript/pull/12346
Johannes

2
ยังไม่รองรับ Internet Explorer
Sammi

1
ไม่ดี. โยนข้อผิดพลาดเช่นกับdocument.styleSheets[0].cssRules.entries()หรือแม้กระทั่งdocument.styleSheets.entries()และโครงสร้างอื่น ๆ iterable DOM อื่น ๆ อีกมากมาย ยังคงต้องใช้_.forEach()จากlodash
Steven Pribilinskiy

2
@Steven: for (var value of document.styleSheets) {}ถ้าคุณไม่จำเป็นต้องดัชนีคุณก็สามารถทำได้ หากคุณจำเป็นต้องดัชนีคุณสามารถแปลงค่าเป็นอาร์เรย์แรกผ่าน:Array.from for (let [index, value] of Array.from(document.styleSheets)) {}
เฟลิกซ์คลิง

1
เยี่ยมมาก! Array.fromคือ FTW
Steven Pribilinskiy

28

ในโลกของฟังก์ชั่นพื้นเมืองใหม่ที่ฉูดฉาดบางครั้งเราลืมพื้นฐาน

for (let i = 0; i < arr.length; i++) {
    console.log('index:', i, 'element:', arr[i]);
}

สะอาดมีประสิทธิภาพและคุณยังสามารถbreakวนซ้ำได้ โบนัส! คุณสามารถเริ่มจากจุดสิ้นสุดและย้อนกลับไปด้วยi--!

หมายเหตุเพิ่มเติม: หากคุณใช้ค่าจำนวนมากในลูปคุณอาจต้องการทำconst value = arr[i];ที่ด้านบนของลูปเพื่อการอ้างอิงที่ง่ายและอ่านได้


1
อ๋อ ดีหนึ่งชัดเจนและเรียบง่าย โอ้และชอบที่คุณมีวิธีที่ง่ายสุด ๆ ในการเข้าถึงคีย์ / ดัชนีของอาร์เรย์
รวม

2
ตามเงื่อนไขควรมีลักษณะเช่นนี้ -> สำหรับ (ให้ i = 0; i <arr.length; i ++) โดยไม่ต้อง (-1) มิเช่นนั้นจะไม่วนซ้ำตลอดองค์ประกอบทั้งหมดของอาร์เรย์
รวม

1
@ จับรวมที่ดี! ฉันได้อัปเดตคำตอบของฉันเพื่อสะท้อนถึงบันทึกย่อของคุณ
chris

4
คุณยังสามารถbreaka for-ofและfor (let [index, value] of array.entries())อ่านง่ายกว่ามาก .reverse()จะย้อนกลับเป็นเรื่องง่ายเหมือนการเพิ่ม
Nigel B. Peck

3
ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดสำหรับคำถามนี้ มันจะไม่เป็นคำตอบที่ได้รับการยอมรับ แต่ช่วยคนจำนวนไม่กี่โหลขึ้นไปที่ค้นหาคำถามนี้ นี่คือสิ่งที่เป็นเพื่อ
Danoram

3

ในบริบท html / js บนเบราว์เซอร์ที่ทันสมัยพร้อมกับวัตถุที่ซ้ำได้อื่น ๆ นอกเหนือจากอาร์เรย์เรายังสามารถใช้ [Iterable] .entries ():

for(let [index, element] of document.querySelectorAll('div').entries()) {

    element.innerHTML = '#' + index

}

ใช่ทำงานได้ในขณะที่วิธีการอื่น ๆ ที่กล่าวถึงข้างต้นโดย @Steven Pribilinskiy วิธี DOM อื่น ๆ ส่งคืนวัตถุที่ไม่มีentriesวิธีการสำหรับพวกเขา
matanster

3

ในวงเราสามารถบรรลุนี้ผ่านทางfor..of ส่งคืนวัตถุ Array iterator ใหม่ วัตถุตัววนซ้ำรู้วิธีเข้าถึงรายการจากตัววนซ้ำในขณะเดียวกันก็คอยติดตามตำแหน่งปัจจุบันภายในลำดับนั้นarray.entries()array.entries

เมื่อnext()วิธีการถูกเรียกในคู่ค่าคีย์ตัววนซ้ำจะถูกสร้างขึ้น ในค่าคีย์เหล่านี้จับคู่ดัชนีอาร์เรย์คือคีย์และรายการอาร์เรย์คือค่า

let arr = ['a', 'b', 'c'];
let iterator = arr.entries();
console.log(iterator.next().value); // [0, 'a']
console.log(iterator.next().value); // [1, 'b']

การfor..ofวนซ้ำนั้นเป็นโครงสร้างที่สิ้นเปลือง iterable และวนรอบองค์ประกอบทั้งหมด (โดยใช้ iterator ใต้ฝากระโปรง) เราสามารถรวมสิ่งนี้เข้ากับarray.entries()วิธีดังต่อไปนี้:

array = ['a', 'b', 'c'];

for (let indexValue of array.entries()) {
  console.log(indexValue);
}


// we can use array destructuring to conveniently
// store the index and value in variables
for (let [index, value] of array.entries()) {
   console.log(index, value);
}


3

นอกจากนี้คุณยังสามารถจัดการกับดัชนีตัวเองถ้าคุณจำเป็นต้องมีดัชนีก็จะไม่ทำงานถ้าคุณต้องการที่สำคัญ

let i = 0;
for (const item of iterableItems) {
  // do something with index
  console.log(i);

  i++;
}

0

สำหรับผู้ที่ใช้ออบเจ็กต์ที่ไม่Arrayเหมือนอาเรย์หรือคุณสามารถสร้าง iterable ของคุณเองได้อย่างง่ายดายดังนั้นคุณยังสามารถใช้for ofสำหรับสิ่งlocalStorageที่มีเพียงlength:

function indexerator(length) {
    var output = new Object();
    var index = 0;
    output[Symbol.iterator] = function() {
        return {next:function() {
            return (index < length) ? {value:index++} : {done:true};
        }};
    };
    return output;
}

จากนั้นให้ป้อนตัวเลข:

for (let index of indexerator(localStorage.length))
    console.log(localStorage.key(index))

0

ES6 for...in

for(const index in [15, 64, 78]) {                        
    console.log(index);
}

5
คำถามกำลังถามเกี่ยวกับการfor...ofวนซ้ำไม่ใช่for...in
Abraham Hernandez

3
for...inเป็นส่วนหนึ่งของข้อมูลจำเพาะ ECMAScript ดั้งเดิม (เช่น "es1") นอกจากนี้โปรดทราบว่าfor...inมีความหมายสำหรับการวนซ้ำคุณสมบัติของวัตถุ ในขณะที่มันสามารถทำซ้ำในอาร์เรย์มันอาจไม่ทำตามคำสั่งที่คาดไว้ ดูเพิ่มเติมในเอกสารประกอบของ MDN
Boaz


-6
var fruits = ["apple","pear","peach"];
for (fruit of fruits) {
    console.log(fruits.indexOf(fruit));
    //it shows the index of every fruit from fruits
}

for วนรอบอาร์เรย์ในขณะที่คุณสมบัติ indexof รับค่าของดัชนีที่ตรงกับอาร์เรย์ PD วิธีนี้มีข้อบกพร่องบางอย่างที่มีตัวเลขดังนั้นใช้ผลไม้


2
ขั้นตอนนี้ใช้เวลา O (n ^ 2)
Harry

3
ในกรณีที่ประสิทธิภาพไม่สำคัญก็ยังไม่ให้ดัชนีที่ถูกต้องทั้งหมดเมื่อมีผลไม้ที่ซ้ำกัน ตัวอย่างเช่นสำหรับ["apple", "apple", "pear"]ดัชนีที่กำหนดเป็นแทน0, 0, 2 0, 1, 2
trichoplax
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.