シーケンスのPython'enumerate 'に相当するES6とは何ですか?


102

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 2015

@JamesAllardiceとmozillaのドキュメント:elements.map((element,index) => index + ':' + element)
Guillaume Vincent

回答:


109

はい、ありArray.prototype.entries()ます。チェックしてください。

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

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


2
これはとてもシンプルでとてもクールです。enumerateよりもPythonに近く[].map()、イテレータを返します。
Shanoor 2015

3
これは、map((el、idx)=> ..)を使用することと同じではありません。これは、実行したいfilterが、フィルタリングする前に持っていたインデックスを保持したい場合があるためです。
derekdreery 2018

30

Array.prototype.mapすでにコールバックプロシージャの2番目の引数としてインデックスを提供しています...そしてそれほとんどどこでもサポートされています。

['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"]

2
これは芋よりも優れているentries()
StephenBoesch

22

let array = [1, 3, 5];
for (let [index, value] of array.entries()) 
     console.log(index + '=' + value);


6

私が無知であるならすみません(ここでは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

pythonicenumerate配列だけでなく、すべてのイテレータで機能し、Pythonのようにイテレータを返す関数を提供します。

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のヘルプセンターのスパマーならない方法によると、「ここのコミュニティは、明白な自己宣伝に反対票を投じ、スパムとしてフラグを立てる傾向があります。適切で関連性のある回答を投稿し、一部(すべてではない)があなたの製品やウェブサイト、それは大丈夫です。しかし、あなたはあなたの答えであなたの所属を開示しなければなりません。 "
ソロモンウッコ

3
@KeyvanSolomonは完全に正しいです。あなたはこのライブラリを所有しており、あなたが唯一の作者であり、寄稿者です。ライセンスを選択する方法は関係ありません。投稿で推奨またはリンクしているライブラリ、製品、記事などの所有権または所属を開示する必要があります。これは非常に単純な要件であり、誰もあなたに失礼なことや不合理なことを求めていることはありません。
meagar

あなたの要求ごとに追加しました
Keyvan

2

などKyleShanoor言うのです)(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.