2017-08-06 5 views
2

配列のすべてのメンバーを反復して関数にパラメータとして渡す関数を記述しています。配列の各メンバーは、コンソールに出力されます。objと配列の両方で機能する関数 - JS

次に、関数にパラメータとしてARRAYまたはOBJECTが渡されても機能するように、その関数を拡張する必要があります。これは、パラメータがARRAYかOBJECTかどうかを区別する方法を知る必要があることを意味します。

現在、私はforループを使用していますが、バリエーションのためにforEachバージョンも作成しました。

は私のコードを参照してください:ここ

function iterateMembers(arg){ 
    for(let i = 0; i < arg.length; i++){ 
    console.log(arg[i]); 
    } 
} 

let output = iterateMembers(arr); 
console.log(output); 


// forEach Version 

function iterateMembers(arg){ 
    arg.forEach((item) => console.log(item));  
} 


let arr = ['nci', 12, 'blog', 15]; 
let obj = { 
    firstname: 'nci', 
    lastname: 'g', 
    age: 21 
}; 

let output = iterateMembers(arr); 
console.log(output); 

一つの大きな問題は、私がobjに渡されたとき、それは何も返さず、ES5およびES6バージョンの両方にエラーを返すということです。これは、ARRAYまたはOBJECTがその関数にパラメータとして渡された場合でも機能するはずです。これは、パラメータがARRAYかOBJECTかどうかを区別する方法を知る必要があることを意味します。

これを適切に処理して、アレイまたはオブジェクトの内容をコンソールに出力する必要があります。 ES5とES6の両方のバージョンでこの機能を作成する必要があります。私は何が不足しているか考えていますか?どうやってやるの?

+0

です'Object'をループすると、' Object.keys(obj) '(キーを得るために.valuesを、または値を得るために.valuesをループするか、単にキーをループしてキーで値を取得します)。あなたの例では、配列には1次元(値)があり、オブジェクトにはKey-> Valueのペアがあるため、Objectキーをつかんでループする必要があります。アプローチは異なりますが、これはおそらくあなたが欠けているものです。 – briosheje

答えて

2

あなたのiterateMembers関数に渡されたオブジェクトのコンストラクタをチェックして、if文2を区別するために使用することができます:パラメータが渡された時はいつでも

function iterateMembers(arg) { 
    if(arg.constructor === Array) { 
     for(var i=0;i<arg.length;i++) { 
      var element = arg[i]; 
      console.log(element); 
     } 
    } else { 
     for(var i=0;i<Object.keys(arg).length;i++) { 
      var index = Object.keys(arg)[i]; 
      var element = arg[index]; 
      console.log(element); 
     } 
    } 
} 

var obj = {'key1': 'val1', 'key2': 'val2', 'key3': 'val3'}; 
var arr = ['key1', 'key2', 'key3']; 

iterateMembers(arr);//Outputs key1, key2, key3 
iterateMembers(obj);//Outputs val1, val2, val3 
+0

なぜArray.isArrayを使用しないのですか – Icepickle

+0

これもうまくいくでしょうが、コンストラクタへのアクセスは、[ここ](https://jsfiddle.net/pwmd82xc/)のようにメソッドを呼び出すよりも少し速いと思います。さらに[コンストラクタ](https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor)はすべてのブラウザで動作することが保証されていますが、[Array.isArray](https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray)は、MDN Webドキュメントによれば、あまりサポートされていません。どちらの場合でも、その差はごくわずかです。私の思うような個人的な好みにまでこだわる。 – afterburn

+0

あなたが送る例は 'console.time(label)'と 'consoleを利用することができます。サポートされていないWindows XPでも私が正しいとすれば、インターネットエクスプローラの最小バージョンがバージョン9であることを考慮して、サポートされていないのはやや上です。私の場合、両方の例とも0ミリ秒でした; – Icepickle

1

配列を区別し、あなたがこの回答見ることができるオブジェクトへのために:あなたが使用できるオブジェクトのキー/値を反復処理するためにCheck if object is array?

を:

iterateMembers(Object.keys(obj)) 
or 
iterateMembers(Object.values(obj)) 
3

あなたはfor (variable in object) {

function iterateMembers(arg){ 
 
    for(var key in arg) 
 
     console.log(arg[key]); 
 
} 
 

 

 
let arr = ['sam', 12, 'norton', 15]; 
 
let obj = { 
 
    firstname: 'sam', 
 
    lastname: 'norton', 
 
    age: 21 
 
}; 
 
iterateMembers(arr); 
 
iterateMembers(obj);
を使用することができます

2

いずれかのオブジェクトまたは配列。

function iterate(object) { 
 
    return Object.keys(object).map(k => object[k]); 
 
} 
 

 
let array = ['sam', 12, 'norton', 15]; 
 
let object = { firstname: 'sam', lastname: 'norton', age: 21 }; 
 

 
console.log(...iterate(array)); 
 
console.log(...iterate(object));

関連する問題