อะไรคือ ES6 เทียบเท่ากับ Python 'enumerate' สำหรับลำดับ


97

Python มีฟังก์ชันในตัวenumerateเพื่อให้ได้(index, item)คู่ที่ทำซ้ำได้

ES6 มีค่าเทียบเท่าสำหรับอาร์เรย์หรือไม่ มันคืออะไร?

def elements_with_index(elements):
    modified_elements = []
    for i, element in enumerate(elements):
         modified_elements.append("%d:%s" % (i, element))
    return modified_elements

print(elements_with_index(["a","b"]))
#['0:a', '1:b']

เทียบเท่า ES6 โดยไม่มีenumerate:

function elements_with_index(elements){
     return elements.map(element => elements.indexOf(element) + ':' + element);
 }

console.log(elements_with_index(['a','b']))
//[ '0:a', '1:b' ]

แต่แผนที่หรือ forEach ทำแล้วได้ทั้งองค์ประกอบและดัชนี
juvian

อย่างที่ @juvian บอกทำไมไม่ใช้แค่ดัชนีที่มีอยู่ในแผนที่ล่ะ? elements.map(( element, i ) => `${ i }:${ element }`);
James Allardice

@JamesAllardice พร้อมเอกสารจาก mozilla: elements.map((element,index) => index + ':' + element)
Guillaume Vincent

คำตอบ:


104

Array.prototype.entries()ใช่มีตรวจสอบ

const foobar = ['A', 'B', 'C'];

for (const [index, element] of foobar.entries()) {
  console.log(index, element);
}


1
นี่เรียบง่ายมาก ๆ มันอยู่ใกล้กับ python enumerateมากกว่า[].map()มันจะส่งคืนตัวทำซ้ำ
Shanoor

2
สิ่งนี้ไม่เทียบเท่ากับการใช้แผนที่ ((el, idx) => .. ) เนื่องจากบางทีคุณอาจต้องการดำเนินการfilterแต่เก็บดัชนีที่คุณมีไว้ก่อนกรอง
derekdreery

26

Array.prototype.mapให้ดัชนีเป็นอาร์กิวเมนต์ที่สองของกระบวนการโทรกลับแล้ว ... และได้รับการสนับสนุนเกือบทุกที่

['a','b'].map(function(element, index) { return index + ':' + element; });
//=> ["0:a", "1:b"]

ชอบ ES6 เหมือนกัน

['a','b'].map((e,i) => `${i}:${e}`)
//=> ["0:a", "1:b"]

นี่คือ imo ดีกว่าentries()
StephenBoesch


5

ขอโทษนะถ้าฉันไม่รู้ (เป็นมือใหม่หัดใช้ JavaScript ที่นี่) แต่คุณใช้forEachไม่ได้เหรอ? เช่น:

function withIndex(elements) {
    var results = [];
    elements.forEach(function(e, ind) {
        results.push(`${e}:${ind}`);
    });
    return results;
}

alert(withIndex(['a', 'b']));

นอกจากนี้ยังมีคำตอบของ naomikซึ่งเหมาะกว่าสำหรับกรณีการใช้งานนี้โดยเฉพาะ แต่ฉันแค่อยากจะชี้ให้เห็นว่ามันforEachเหมาะกับใบเรียกเก็บเงินด้วย

รองรับ ES5 +


5

pythonicมีenumerateฟังก์ชั่นที่ทำงานบน iterables ทั้งหมดไม่เพียงอาร์เรย์และส่งกลับIteratorเช่นงูหลาม:

import {enumerate} from 'pythonic';

const arr = ['a', 'b'];
for (const [index, value] of enumerate(arr))
    console.log(`index: ${index}, value: ${value}`);
// index: 0, value: a
// index: 1, value: b

การเปิดเผยข้อมูลฉันเป็นผู้เขียนและผู้ดูแล Pythonic


4
pythonicกรุณาแจ้งที่คุณช่วยพัฒนา อ้างอิงจากวิธีการไม่เป็นสแปมเมอร์ในศูนย์ช่วยเหลือของ Stack Overflow "ชุมชนที่นี่มีแนวโน้มที่จะโหวตลดการโปรโมตตนเองอย่างเปิดเผยและตั้งค่าสถานะว่าเป็นสแปมโพสต์คำตอบที่ดีและตรงประเด็นและหากมีบางส่วน (แต่ไม่ใช่ทั้งหมด) เกิดขึ้น ผลิตภัณฑ์หรือเว็บไซต์ของคุณไม่เป็นไรอย่างไรก็ตามคุณต้องเปิดเผยความเกี่ยวข้องของคุณในคำตอบของคุณ "
Solomon Ucko

3
@Keyvan Solomon ถูกต้องสมบูรณ์ คุณเป็นเจ้าของห้องสมุดนี้คุณเป็นผู้เขียนและผู้สนับสนุน แต่เพียงผู้เดียว วิธีที่คุณเลือกอนุญาตไม่เกี่ยวข้อง คุณต้องเปิดเผยความเป็นเจ้าของหรือความเกี่ยวข้องกับไลบรารีผลิตภัณฑ์บทความ ฯลฯ ที่คุณแนะนำหรือลิงก์ไปยังในโพสต์ของคุณ นี่เป็นข้อกำหนดที่ง่ายมากไม่มีใครหยาบคายกับคุณหรือขออะไรที่ไม่สมเหตุสมผล
meagar

เพิ่มตามคำขอของคุณ
Keyvan

1

เป็นKyleและShanoorพูดคือArray.prototype.entries ()

แต่สำหรับมือใหม่อย่างฉันยากที่จะเข้าใจความหมายของมันอย่างถ่องแท้

ดังนั้นนี่จึงเป็นตัวอย่างที่เข้าใจได้:

for(let curIndexValueList of someArray.entries()){
  console.log("curIndexValueList=", curIndexValueList)
  let curIndex = curIndexValueList[0]
  let curValue = curIndexValueList[1]
  console.log("curIndex=", curIndex, ", curValue=", curValue)
}

เทียบเท่ากับpythonรหัส:

for curIndex, curValue in enumerate(someArray):
  print("curIndex=%s, curValue=%s" % (curIndex, curValue))
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.