2017-04-21 75 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);