根据其他值

时间:2017-11-02 18:42:55

标签: javascript arrays json merge

我尝试根据一系列匹配属性合并数组中的一组字符串,并删除重复的项目。

我当前的数组:

{id: "12", value: "Option 1"},
{id: "55", value: "Option A"},
{id: "55", value: "Option B"},
{id: "55", value: "Option C"},
{id: "55", value: "Option D"},
{id: "106", value: "Option 1"}

我想合并所有ID为' 55'所以我的数组看起来像这样:

{id: "12", value: "Option 1"},
{id: "55", value: "Option A, Option B, Option C, Option D"},
{id: "106", value: "Option}

我只能设法使用for循环合并前两个项目并检查-1兄弟,并且可以在没有严重膨胀的情况下解决这个问题。

任何建议都将受到赞赏。

3 个答案:

答案 0 :(得分:2)

您可以将对象用作查找表,同时将结果并行存储在数组中:

const lookup = {}, result = [];

for( const {id, value} of input ){
  if(lookup[id]){
     lookup[id].value += "," + value;
  }else{
     result.push( lookup[id] = {id, value} );
  }
}

这是一个非常新的javascript,但现代引擎上的works;)

答案 1 :(得分:1)

有点晚了。但您可以使用for/while循环尝试此操作。这是一种非常基本的方法。如果时间复杂性不是问题。否则Jons的答案是好的。



var x = [{id: "12", value: "Option 1"},
{id: "55", value: "Option A"},
{id: "55", value: "Option B"},
{id: "55", value: "Option C"},
{id: "55", value: "Option D"},
{id: "12", value: "Option D"},
{id: "53", value: "Option D"},
{id: "106", value: "Option 1"}];

for(var j =0; j<x.length;j++){
for(var i =0; i<x.length;i++){
  if(x[j].id == x[i].id && i !=j){
     x[j].value = x[j].value + "," +x[i].value;
     x.splice(i, 1);
     }
  }
}
console.log(x);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您可以使用array#reduce

const data = [{id: "12", value: "Option 1"},{id: "55", value: "Option A"},{id: "55", value: "Option B"},{id: "55", value: "Option C"},{id: "55", value: "Option D"},{id: "106", value: "Option 1"}];

var result = data.reduce((r, o) => {
  return r[o.id] = r[o.id] ? (r[o.id].value += ", " + o.value, r[o.id]) : o, r;
},{})

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