Javascript 数组需要基于键值对删除重复对象,并返回sum[fiddle]
需要根据匹配的关键点删除重复的对象,但需要添加值。已经创建了代码片段和小提琴来查看。 在底部还添加了预期结果 我尝试过几种不同的方法,但都没有达到预期的效果。我可以使用filter方法,但不能为匹配的键添加值。 请看一看小提琴或片段Javascript 数组需要基于键值对删除重复对象,并返回sum[fiddle],javascript,Javascript,需要根据匹配的关键点删除重复的对象,但需要添加值。已经创建了代码片段和小提琴来查看。 在底部还添加了预期结果 我尝试过几种不同的方法,但都没有达到预期的效果。我可以使用filter方法,但不能为匹配的键添加值。 请看一看小提琴或片段 让数据2=[{ 面积:{ 类型:“双”, 价值:50 }, 域名:{ 键入:“字符串”, 价值:“西区” }, 地区名称:{ 键入:“字符串”, 价值:“岩石” } }, { 面积:{ 类型:“双”, 价值:250 }, 域名:{ 键入:“字符串”, 值:“北”
让数据2=[{
面积:{
类型:“双”,
价值:50
},
域名:{
键入:“字符串”,
价值:“西区”
},
地区名称:{
键入:“字符串”,
价值:“岩石”
}
},
{
面积:{
类型:“双”,
价值:250
},
域名:{
键入:“字符串”,
值:“北”
},
地区名称:{
键入:“字符串”,
价值:“沙”
}
},
{
面积:{
类型:“双”,
价值:400
},
域名:{
键入:“字符串”,
价值:“西区”
},
地区名称:{
键入:“字符串”,
价值:“岩石”
}
}
];
var filterData2=Object.keys(data2).reduce((acc,elem)=>{
让getKeys=data2[elem];
console.log(getKeys);
返回acc;
}, []);
console.log(filterData2);
//预期结果
让结果=[{
面积:{
类型:“双”,
价值:450
},
域名:{
键入:“字符串”,
价值:“西区”
},
地区名称:{
键入:“字符串”,
价值:“岩石”
}
},
{
面积:{
类型:“双”,
价值:250
},
域名:{
键入:“字符串”,
值:“北”
},
地区名称:{
键入:“字符串”,
价值:“沙”
}
}
]
控制台日志(结果)代码>使用下面这样的方法可以得到想要的结果。解释作为注释添加到代码中
注意我使用了Object.assign
作为curr=Object.assign({},x)代码>而不是curr=x代码>因为使用curr=x
稍后当我们在查找现有对象时更新值时,它也会更新数据2
的值。使用Object.assign({},x)代码>这不会发生
让数据2=[{
面积:{
类型:“双”,
价值:50
},
域名:{
键入:“字符串”,
价值:“西区”
},
地区名称:{
键入:“字符串”,
价值:“岩石”
}
},
{
面积:{
类型:“双”,
价值:250
},
域名:{
键入:“字符串”,
值:“北”
},
地区名称:{
键入:“字符串”,
价值:“沙”
}
},
{
面积:{
类型:“双”,
价值:400
},
域名:{
键入:“字符串”,
价值:“西区”
},
地区名称:{
键入:“字符串”,
价值:“岩石”
}
}
];
//使用reduce迭代数组并生成结果
var结果=数据2.减少((a,x)=>{
//从中查找匹配的对象。
让curr=a.filter(y=>y.areaName.value==x.areaName.value&&y.areaTitle.value==x.areaTitle.value)[0];
//如果不存在,则创建新对象并添加到
//否则会将值添加到curr.area.value
如果(!curr){
curr=Object.assign({},x);
a、 推动(电流);
}否则{
curr.area.value+=x.area.value;
}
//归还
返回a;
}, []);
控制台日志(结果)
Ciao,您可以尝试获取不同的areaName.value
,然后在data2
上迭代求和area.value
如下:
让数据2=[{
面积:{
类型:“双”,
价值:50
},
域名:{
键入:“字符串”,
价值:“西区”
},
地区名称:{
键入:“字符串”,
价值:“岩石”
}
},
{
面积:{
类型:“双”,
价值:250
},
域名:{
键入:“字符串”,
值:“北”
},
地区名称:{
键入:“字符串”,
价值:“沙”
}
},
{
面积:{
类型:“双”,
价值:400
},
域名:{
键入:“字符串”,
价值:“西区”
},
地区名称:{
键入:“字符串”,
价值:“岩石”
}
}
];
让areas=[…新集合(data2.map(el=>el.areaName.value));
让结果=[];
区域。forEach(区域=>{
让dataToSum=data2.filter(el=>el.areaName.value===area)
设obj={};
设面积和=0
dataToSum.forEach(el=>{
面积总和+=el.面积值;
})
obj.area={type:dataToSum[0].area.type,值:areasum}
obj.areaName={type:dataToSum[0]。areaName.type,值:area}
obj.areaTitle={type:dataToSum[0]。areaTitle.type,值:dataToSum[0]。areaTitle.value}
结果推送(obj)
})
console.log(结果)
具有以下功能的解决方案:
没问题:):@Karan我没有控制副作用。我将编辑答案以提供控制它们的选项
let data2 = [{
area: {
type: "double",
value: 50
},
areaName: {
type: "string",
value: "westside"
},
areaTitle: {
type: "string",
value: "rock"
}
},
{
area: {
type: "double",
value: 250
},
areaName: {
type: "string",
value: "north"
},
areaTitle: {
type: "string",
value: "sand"
}
},
{
area: {
type: "double",
value: 400
},
areaName: {
type: "string",
value: "westside"
},
areaTitle: {
type: "string",
value: "rock"
}
}
];
let result = [];
let found = null;
data2.forEach( x => {
found = result.find( y => x.areaName.value === y.areaName.value && x.areaTitle.value === y.areaTitle.value);
if (found){
found.area.value += x.area.value;
} else {
// option1: simple
// result.push(x);
// option2: controlling side effects
result.push({
area: { value: x.area.value, type: x.area.type },
areaName: x.areaName,
areaTitle:x.areaTitle
});
}
});
// Expected result
let expected = [{
Area: {
type: "double",
value: 450
},
AreaName: {
type: "string",
value: "westside"
},
AreaTitle: {
type: "string",
value: "rock"
}
},
{
Area: {
type: "double",
value: 250
},
AreaName: {
type: "string",
value: "north"
},
AreaTitle: {
type: "string",
value: "sand"
}
}
]
console.log(result,expected);