はじめに
Node.jsを使ったWebアプリの開発にて、forEachでリストを回していたのですが、
急遽インデックスの情報も必要になりました。
そこで次のようなソースコードを書いたものの、「もっといい方法がある」と仲間に指摘されました。
実際に試したところ非常に便利だったことと、Pythonのenumerate関数に近いものを感じたので、
for文でインデックスとバリューを同時に取得する方法として、記事に残します。
ary = ["bar", "foo", "hoge"]
let i = 0
ary.forEach(function( value ) {
console.log(i, value );
i++
});
// 0 bar
// 1 foo
// 2 hoge
実行環境
- Node.js v12.16.3
検証環境
- Paiza.io(Python 3.8.2)
- Paiza.io(Node.js v12.18.3)
そもそもenumerate関数とは
引数に指定したリストの、インデックスとバリューを取得する関数です。
ary = ["bar", "foo", "hoge"]
for i, item in enumerate(ary):
print(i, item)
# 0 bar
# 1 foo
# 2 hoge
for文でインデックスとバリューを同時に取得する
forEachは、第二引数にインデックスを指定できる
forEach関数において 第一引数はリスト、第二引数はインデックスを取ります。
このインデックスは、ループ回数が増加するごとに自動的にインクリメントされるため、
i++
やi += 1
と記述する必要はありません。
ary = ["bar", "foo", "hoge"]
ary.forEach(function(value, i) {
console.log(i, value);
});
// 0 bar
// 1 foo
// 2 hoge
for in
を使う
for in
はリストのインデックスを取得します。
次のようなソースコードにより、インデックスとバリューを取り出します。
ary = ["bar", "foo", "hoge"]
for (i in ary){
console.log(i, ary[i])
}
// 0 bar
// 1 foo
// 2 hoge
一方で、for in
では次のように予期しない挙動を示す場合もあるので、
利用には注意が必要そうです。
var data = [ 'apple', 'orange', 'banana'];
//配列オブジェクトにhogeメソッドを追加
Array.prototype.hoge = function(){}
for (var key in data){
console.log(data[key]);
}
// apple
// orange
// banana
// function(){}