2016-04-09 15 views
2

配列やオブジェクトを正しくループする一般的なforループを作成する方法はありますか?私は次のループを書くことができますが、配列に追加される他のプロパティもループします。私は繰り返しますforループを意味これによりJavascript Generic For Loop

for (item in x) { 
    console.log(item) 
} 

first 
second 

として

1 
2 

yと

x = [1, 2] 
x.foo = "foo" 
y = {first:1, second: 2} 

Xこの背後にある理由は、Iということです実行時までxが何になるかはわかりません配列またはオブジェクト)。実行時にチェックする関数を作成する唯一のオプションはありますか?

+2

あなたが扱っているどのような種類がわからない場合、あなたはあなたが扱っているものの種類を知る立場に自分を入れてみてください。これは、同僚による過失致死を防ぐための最も簡単な方法です。 –

+0

あなたのコメントにはっきりと同意します。透明性は常に求められています。あいまいさの理由は、Javascriptにコンパイルされた動的言語用のコンパイラを作成していることです。そのため、ループのソースが何であるかは必ずしも分かりませんので、実行時に動作するforループを作成する一般的な方法が必要でした。 – cbillingham

+0

JSではすべてがObjectです。したがって、実際の違いがないので、配列や関数をオブジェクトとして扱う方が賢明かもしれません。上の例では 'x = [1、2];バツ。foo = "foo"; 'Object.keys(x)は' ["0"、 "1"、 "foo"] 'をリストしますが、彼はあなたに列挙できない' length'プロパティを表示しません。場合によっては 'Object.getOwnPropertyNames(x);'を使うことを選ぶかもしれませんし、 '[" 0 "、" 1 "、" length "、" foo "]のように列挙可能でもなくても、 – Redu

答えて

3

for..of loopを使用してください。

const object = { 
    some: "string", 
    number: 42 
}; 
for (const [key, value] of Object.entries(object)) { 
    console.log(key, value); 
} 

とにかくオブジェクトの上に配列

const array = [1, 2]; 
array.foo = "test"; 
for (const number of array) { 
    console.log(number); // skips array.foo 
} 

反復処理をオーバー

反復処理は、ビューのコードスタイルの点から、あなたはまだあなたがそれを反復する前に、オブジェクトが配列であるかどうかを確認する必要があります。あなたはそれを達成するためにArray.isArrayを使用することができます。 JavaScriptを、typeof [] === "object"(すなわち配列はそのキーとして要素のインデックスを使用するオブジェクトである)で、あなたがそれを減らすことができるので

if (Array.isArray(data)) { 
    for (const element of data) { 
     // Iterate over array 
    } 
} 
else { 
    for (const [key, value] of Object.entries(data)) { 
     // Iterate over object 
    } 
} 

ジェネリックループ

:だから、dataと仮定すると、オブジェクトまたは配列のいずれかでありますシングルループObject.entries

for (const [key, value] of Object.entries(data)) { 
    // For arrays, `key` will be the index 
} 

は、この後者の方法は、動的プロパティのあなたの除外に正義をしないだろうということに注意してくださいのに(例えば、 g。 array.foo)、Object.entriesの結果を反復処理します。 の場合はで除外する必要があります。上記のようにArray.isArrayの2つのfor..ofループを使用してください。

0

期待される出力ごとに必要なインデックス/キー値の場合は、ここでは単純な1ライナーを使用します。

function loop(x) { 
    return (Array.isArray(x) ? x : Object.keys(x)).forEach(el => console.log(el)); 
} 

loop(x); // 1 2 
loop(y); // First Second 

DEMO