Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数组需要基于键值对删除重复对象,并返回sum[fiddle]_Javascript - Fatal编程技术网

Javascript 数组需要基于键值对删除重复对象,并返回sum[fiddle]

Javascript 数组需要基于键值对删除重复对象,并返回sum[fiddle],javascript,Javascript,需要根据匹配的关键点删除重复的对象,但需要添加值。已经创建了代码片段和小提琴来查看。 在底部还添加了预期结果 我尝试过几种不同的方法,但都没有达到预期的效果。我可以使用filter方法,但不能为匹配的键添加值。 请看一看小提琴或片段 让数据2=[{ 面积:{ 类型:“双”, 价值:50 }, 域名:{ 键入:“字符串”, 价值:“西区” }, 地区名称:{ 键入:“字符串”, 价值:“岩石” } }, { 面积:{ 类型:“双”, 价值:250 }, 域名:{ 键入:“字符串”, 值:“北”

需要根据匹配的关键点删除重复的对象,但需要添加值。已经创建了代码片段和小提琴来查看。 在底部还添加了预期结果

我尝试过几种不同的方法,但都没有达到预期的效果。我可以使用filter方法,但不能为匹配的键添加值。 请看一看小提琴或片段

让数据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);