2017-04-21 8 views
2

リンクMerge/flatten an array of arrays in JavaScript?を経由すると、やや必要なものです。しかし、そのリンクや他のリンクの多くは、2つの配列の配列のマージを示しています。私が持っているものは次の通りです配列内の配列をマージして、JavaScript内に配列します。

[ 
    { 
     "setter":[ 
     { 
      "keyname":"Sample Size", 
      "cond":"=", 
      "value":1 
     } 
     ] 
    }, 
    { 
     "setter":[ 
     { 
      "joinedcond":"and" 
     }, 
     { 
      "keyname":"Sample Size", 
      "cond":"=", 
      "value":2 
     } 
     ] 
    } 
] 

これは私が配列を持っていて、配列 "setter"を持っていることです。 私が望むのは、実際にはすべてのセッター配列を単一の配列としてマージすることです。マージは以下の出力を生成する必要があります。

[ 
    { 
     "setter":[ 
     { 
      "keyname":"Sample Size", 
      "cond":"=", 
      "value":1 
     }, 
     { 
      "joinedcond":"and" 
     }, 
     { 
      "keyname":"Sample Size", 
      "cond":"=", 
      "value":2 
     } 
     ] 
    } 
] 

助けていただければ幸いです。おかげ

+0

あなたは本当に最終的な出力のための配列が必要ですか? 'setter'プロパティを持つ単純なオブジェクトではありませんか? – Weedoze

+0

@Weedoze残念ながらいいえ... – Neo

+0

ok問題はありません!私はあなたに配列を生成するためのソリューションを提供しました – Weedoze

答えて

0

あなたは次のように、あなたが外側のキーのハッシュテーブルを使用することができArray#reduce

var arr = [{"setter":[{"keyname":"Sample Size","cond":"=","value":1}]},{"setter":[{"joinedcond":"and"},{"keyname":"Sample Size","cond":"=","value":2}]}]; 
 

 
var finalArr = arr.reduce((a,x)=>{ 
 
    (a[0].setter = a[0].setter || []).push(...x.setter); 
 
    return a; 
 
},[{}]); 
 

 
console.log(finalArr);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

ありがとうございました。いくつかのことを知りたいですか?1)正確にプッシュの内部は? 2)それは速くなるでしょうか? – Neo

+0

@Neo '...'はスプレッド演算子です(ドキュメントをチェックしてください)。私は 'push'関数の中でそれを使って、setterをループさせる代わりにすべての配列を押して、各項目を一つ一つ押します。何に比べて速いですか? – Weedoze

+0

これは...私は実際にはループよりも速いと期待していました。しかし、普及したオペレータがトリックをしたと思いますか? – Neo

0

を使用し、外側のキーの動的なアプローチとインナー値CONCATそれを行うことができますsetter。 ES6休憩とスプレッドの演算子を使用して

var data = [{ setter: [{ keyname: "Sample Size", cond: "=", value: 1 }] }, { setter: [{ joinedcond: "and" }, { keyname: "Sample Size", cond: "=", value: 2 }] }], 
 
    result = data.reduce(function (hash) { 
 
     return function (r, o) { 
 
      Object.keys(o).forEach(function (k) { 
 
       if (!hash[k]) { 
 
        hash[k] = {}; 
 
        r.push(hash[k]); 
 
       } 
 
       hash[k][k] = (hash[k][k] || []).concat(o[k]); 
 
      }); 
 
      return r; 
 
     }; 
 
    }(Object.create(null)), []); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

我々は、再帰関数呼び出しと同じことを達成することができます

let cdata= data.slice();//Copy the data 
let condensedArray=[]; 

function flatten(data, ...rest){ 
    let [{ setter }] = data; 
    condensedArray = [...condensedArray, ...setter]; 
    data.splice(0,1); 
    data.length>0?flatten(data, ...data):console.log('Complete'); 
} 

flatten(cdata, ...cdata); 
console.log(condensedArray); 
関連する問題