Javascript 在值为数组的数组中合并2个对象

Javascript 在值为数组的数组中合并2个对象,javascript,node.js,arrays,Javascript,Node.js,Arrays,我试图合并来自同一数组的两个对象中的值。本例中的对象相似,我要合并的值是数组(Set) 预期产量 [ { name: "foo1", value: ["val1","val2", "val3"] },{ name: "foo2", value: ["val4","val4", "val5"] } ] 我的代码 var o

我试图合并来自同一数组的两个对象中的值。本例中的对象相似,我要合并的值是数组(Set)

预期产量

[
{
  name: "foo1",
  value: ["val1","val2", "val3"]
},{
  name: "foo2",
  value: ["val4","val4", "val5"]
}
]
我的代码

var output = [];

array.forEach(function(item) {
  var existing = output.filter(function(v, i) {
    return v.name == item.name;
  });
  if (existing.length) {
    var existingIndex = output.indexOf(existing[0]);
    let newValue = new Set(output[existingIndex].value).add(item.value)
    output[existingIndex].value = Array.from(newValue);
  } else {
    output.push(item);
  }
});

产出

[ {
  name: "foo1",
  value: ["val1", "val2", ["val2", "val3"]]
}, {
  name: "foo2",
  value: ["val4", ["val4", "val5"]]
}]

如何获得预期的输出(ES6也是首选)

试试这个

const数组=[
{
“名称”:“foo1”,
“价值”:[
“val1”,
“val2”,
“val3”
]
},
{
“名称”:“foo1”,
“价值”:[
“val2”,
“val3”
]
},
{
“名称”:“foo2”,
“价值”:[
“val4”,
“val5”
]
},
{
“名称”:“foo2”,
“价值”:[
“val4”,
“val5”
]
}
]
常量结果=[]
for(数组的常量项){
const existingItem=result.find(i=>i.name==item.name)
如果(现有项目){
existingItem.value=[…新集合([…existingItem.value,…item.value])]
}否则{
结果。推送(项目)
}
}
console.log(结果)
试试这个

const数组=[
{
“名称”:“foo1”,
“价值”:[
“val1”,
“val2”,
“val3”
]
},
{
“名称”:“foo1”,
“价值”:[
“val2”,
“val3”
]
},
{
“名称”:“foo2”,
“价值”:[
“val4”,
“val5”
]
},
{
“名称”:“foo2”,
“价值”:[
“val4”,
“val5”
]
}
]
常量结果=[]
for(数组的常量项){
const existingItem=result.find(i=>i.name==item.name)
如果(现有项目){
existingItem.value=[…新集合([…existingItem.value,…item.value])]
}否则{
结果。推送(项目)
}
}

console.log(result)
这段代码能解决您的问题吗

var array = [
    {
    name: "foo1",
    value: ["val1","val2"]
  }, 
  {
    name: "foo1",
    value: ["val2", "val3"]
  }, 
  {
    name: "foo2",
    value: ["val4"]
  },
   {
    name: "foo2",
    value: ["val4","val5"]
  },
  ];

  var output = [];

array.forEach(function(item) {
  var existing = output.filter(function(v, i) {
    return v.name == item.name;
  });
  if (existing.length) {
    var existingIndex = output.indexOf(existing[0]);
    let newValue = new Set(output[existingIndex].value.concat(item.value))
    output[existingIndex].value = Array.from(newValue);
  } else {
    output.push(item);
  }
});

这个代码能解决你的问题吗

var array = [
    {
    name: "foo1",
    value: ["val1","val2"]
  }, 
  {
    name: "foo1",
    value: ["val2", "val3"]
  }, 
  {
    name: "foo2",
    value: ["val4"]
  },
   {
    name: "foo2",
    value: ["val4","val5"]
  },
  ];

  var output = [];

array.forEach(function(item) {
  var existing = output.filter(function(v, i) {
    return v.name == item.name;
  });
  if (existing.length) {
    var existingIndex = output.indexOf(existing[0]);
    let newValue = new Set(output[existingIndex].value.concat(item.value))
    output[existingIndex].value = Array.from(newValue);
  } else {
    output.push(item);
  }
});

可以使用reduce执行以下操作:

var数组=[
{
名称:“foo1”,
值:[“val1”、“val2”]
}, 
{
名称:“foo1”,
值:[“val2”,“val3”]
}, 
{
名称:“foo2”,
值:[“val4”]
},
{
名称:“foo2”,
值:[“val4”,“val5”]
},
];
res=数组。reduce((上一个,当前)=>{
让index=prev.findIndex(item=>item.name==curr.name);
如果(索引>-1){
s=新集合([…上一个[index].value,…当前值]);
prev[index].value=Array.from(s);
}否则{
上推(当前);
}
返回上一个;
},[]);

控制台日志(res)您可以使用reduce执行以下操作

var数组=[
{
名称:“foo1”,
值:[“val1”、“val2”]
}, 
{
名称:“foo1”,
值:[“val2”,“val3”]
}, 
{
名称:“foo2”,
值:[“val4”]
},
{
名称:“foo2”,
值:[“val4”,“val5”]
},
];
res=数组。reduce((上一个,当前)=>{
让index=prev.findIndex(item=>item.name==curr.name);
如果(索引>-1){
s=新集合([…上一个[index].value,…当前值]);
prev[index].value=Array.from(s);
}否则{
上推(当前);
}
返回上一个;
},[]);

控制台日志(res)
您可以使用
reduce
方法,将
Map
作为累加器值,然后在Map
值上使用扩展语法
来获取值数组

var数组=[{“name”:“foo1”,“value”:[“val1”,“val2”,“val3”]},{“name”:“foo1”,“value”:[“val2”,“val3”]},{“name”:“foo2”,“value”:[“val4”,“val4”,“val5”]},{“name”:“foo2”,“value”:[“val4”,“val5”]}]
const map=array.reduce((r,{name,value})=>{
如果(!r.has(name))r.set(name,{name,value})
else r.get(name).value.push(…value)
r、 get(name).value=[…新集合(r.get(name).value)]
返回r;
},新地图)
const result=[…map.values()]

console.log(result)
您可以使用
reduce
方法,将
Map
作为累加器值,然后在Map
值上使用扩展语法
来获取值数组

var数组=[{“name”:“foo1”,“value”:[“val1”,“val2”,“val3”]},{“name”:“foo1”,“value”:[“val2”,“val3”]},{“name”:“foo2”,“value”:[“val4”,“val4”,“val5”]},{“name”:“foo2”,“value”:[“val4”,“val5”]}]
const map=array.reduce((r,{name,value})=>{
如果(!r.has(name))r.set(name,{name,value})
else r.get(name).value.push(…value)
r、 get(name).value=[…新集合(r.get(name).value)]
返回r;
},新地图)
const result=[…map.values()]
console.log(结果)
试试看

试一试


尝试使用Array.reduce和Array.filter获得如下结果

var数组=[
{
名称:“foo1”,
值:[“val1”、“val2”]
}, 
{
名称:“foo1”,
值:[“val2”,“val3”]
}, 
{
名称:“foo2”,
值:[“val4”]
},
{
名称:“foo2”,
值:[“val4”,“val5”]
},
];
res=数组。reduce((上一个,当前)=>{
让index=prev.findIndex(item=>item.name==curr.name);
如果(索引>-1){
上一个[索引]。值=[…上一个[索引]。值,…当前值];
prev[index].value=prev[index].value.filter((v,i)=>prev[index].value.indexOf(v)==i)
}否则{
上推(当前);
}
返回上一个;
},[]);
控制台日志(res);

尝试使用Array.reduce和Array.filter获得如下结果

var数组=[
{
名称:“foo1”,
值:[“val1”、“val2”]
}, 
{
名称:“foo1”,
值:[“val2”,“val3”]
}, 
{
名称:“foo2”,
值:[“val4”]
},
{
名称:“foo2”,
值:[“val4”,“val5”]
},
];
res=数组。reduce((上一个,当前)=>{
让index=prev.findIndex(item=>item.name==curr.name);
如果(索引>-1){
上一个[索引]。值=[…上一个[索引]。值,…当前值];
prev[index].value=prev[index].value.filter((v,i)=>prev[index].value.indexOf(v)==i)
}否则{
上推(当前);
}
返回上一个;
},[]);
控制台日志(res);

一种方法是创建一个唯一的键列表并对其进行迭代。为每个键创建一个数组并合并值。方法是:

Array.from(new Set(array.map(el => el.name)))
    .map(name => ({
        name,
        value: Array.from(new Set(array.filter(el => el.name === name).flatMap(el => el.value)))
    }))
例如:

const数组=[
{
名称:“foo1”,
值:[“val1”、“val2”]
}, 
{
名称:“foo1”,
值:[“val2”,“val3”]
}, 
{
名称:“foo2”,
值:[“val4”]
},
{
名称:“foo2”,
值:[“val4”,“val5”]
},
];
log(Array.from(新的集合(Array.map(el=>el.name)))
.map(名称=>({
名称
值:Array.from(新集合)(Array.filter(el=>el
Array.from(new Set(array.map(el => el.name)))
    .map(name => ({
        name,
        value: Array.from(new Set(array.filter(el => el.name === name).flatMap(el => el.value)))
    }))