Help us understand the problem. What is going on with this article?

JavaScriptでPythonのenumerate関数を実行するには

はじめに

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(){}

参考

cordy
どうすれば良い記事が書けるか試行錯誤している。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away