2017-04-21 73 views
2

瀏覽鏈接Merge/flatten an array of arrays in JavaScript?是我需要的東西。但是通過該鏈接和其他許多鏈接顯示了兩個數組的數組合並。我有如下在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

沒問題!我提供了一個解決方案來生成一個數組 – 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

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

使用ES6休息和傳播運營商,我們可以實現與遞歸函數調用相同:

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);