2017-05-23 7 views
0

オブジェクトのすべてのキーと値を取得し、それらを配列に格納するために、この小さな関数を記述しました。 {[1,2,3,4] 0}に[0,1,2,3,4]整数JSオブジェクト(キーと値)を単一の深さの配列に平坦化する最良の方法

にすべての要素を変換

Iの目的は...値として

オブジェクトの配列が含まれているかもしれません

function flattenObject(obj) { 
// Returns array with all keys and values of an object 
var array = []; 
$.each(obj, function (key, value) { 
    array.push(key); 
    if ($.isArray(value)) { 
     $.each(value, function (index, element) { 
      array.push(element); 
     }); 
    } 
    else { 
     array.push(value); 
    } 
}); 

return array 

}

ありがとう:そうするために高速/きれいな方法があるかどうかを疑問に思います!

+2

いくつかのデータと希望出力を追加してください。 –

+0

JSでは、これを(ネスティングの任意のレベルに対して)行うための「良い」方法は実際にはありません。明白な解決策は再帰的なことです。スタックを吹き飛ばす可能性があります。あなたが唯一の深いレベルであると確信していれば、コードは問題ありません。 –

+0

https://codereview.stackexchange.com/にコードの改善を求めるのが適しています。あなたのコードはどうですか? 「最良の方法」を求める質問は、さまざまな正解があるため、SOにはあまり適していません。 –

答えて

3

すべてのキーと値を連結することができます。 (これは、キーの数に型キャストを解決しません。)

var object = { 0: [1, 2, 3, 4] }, 
 
    result = Object.keys(object).reduce(function (r, k) { 
 
     return r.concat(k, object[k]); 
 
    }, []); 
 
    
 
console.log(result);

+0

オブジェクトキーを配列に追加したくない場合は、単に 'k'を削除してください'.concat()'から。例: 'Object.keys(object).reduce(function(r、k){ return r.concat(object [k]); }、[]);' – Doug

0

キーと値のタプル(2要素配列)の配列を生成してから、それを深く平坦化します。

function flattenObject(obj) { 
 
     return flatten(Object.keys(obj).map(k => [toNumber(k), obj[k]])); 
 
} 
 

 
// Substitute your own favorite flattening algorithm. 
 
const flatten = a => Array.isArray(a) ? [].concat(...a.map(flatten)) : a; 
 

 
// Convert to number, if you can. 
 
const toNumber = n => isNaN(+n) ? n : +n; 
 

 
console.log(flattenObject({a: [1, 2], b: 3, 0: [1, 2, 3, 4, 5]}));

+0

"...オブジェクトの**キーと値**をすべて取得して配列に格納する..." –

0

あなたが別の配列への配列の内容をプッシュする必要が場合は、内側のループをスキップすることができます。このソリューションは、あなただけはネストがあることを知っているあなたのシナリオでのみ有効です他の1つのレベルまであなたには、いくつかの再帰を持っている必要があります: -

function flattenObject(obj) { 
// Returns array with all keys and values of an object 
var array = []; 
$.each(obj, function (key, value) { 
    array.push(key); 
    if ($.isArray(value)) { 
     Array.prototype.push.apply(array, value); 
    } 
    else { 
     array.push(value); 
    } 
}); 

return array; 
} 
var obj = {"key1" : [1,3,3],"key2" : "val", "key3":23}; 
var output = flattenObject(obj); 
console.log(output); 

フィドルリンク - https://jsfiddle.net/0wu5z79a/1/

EDITを、この場合に役立ちます参照してください。深い内部オブジェクトのために。

関連する問題