my problem is to map two array of objects and sum their specifics properties if they have same name value.
For example if I would like to sum x and y of all objects where property name is 'v' etc. Here is my code
var arr = [{name:'v', x:1, b:2, c:3},{name:'r', x:2, b:0, c:3},{name:'v', x:4, b:3, c:3}, {name:'v', x:1, b:1, c:3}];
let arr2 = []
let obj = {name:null, x:null, b: null, c:null}
arr.map(item => {
for(let i=0; i<= arr.length; i ){
if(item.name === arr[i].name){
let a = arr.reduce((a, b) => ({x: a.x b.x, b: a.b b.b}));
obj.name = item.name, obj.x = a.x, obj.b = a.b, obj.c = item.c
} else {
obj.name = item.name, obj.x=item.x, obj.b=item.b, obj.c=item.c
}
arr2.push(obj)
}
}
)
console.log(arr2)
As result i would like to return array like this
arr2 = [{name: 'v', x: 6, b: 6, c: 3}, {name: 'r', x:2, b:0, c:1}]
CodePudding user response:
const sumProperties = (arr) => {
const result = [];
const map = new Map();
for (const obj of arr) {
const key = obj.name;
if (!map.has(key)) {
map.set(key, obj);
} else {
const oldObj = map.get(key);
const newObj = { ...oldObj, ...obj };
map.set(key, newObj);
}
}
map.forEach((value) => {
result.push(value);
});
return result;
}
console.log(sumProperties(arr));
CodePudding user response:
First I ran reduce
over your array and got an intermediate result in the format below.
{
r: {
b: 0,
c: 3,
name: "r",
x: 2
},
v: {
b: 6,
c: 3,
name: "v",
x: 6
}
}
Then since your expected result is the values of the intermediate result I called Object.values
which returns an array of the values
let arr = [{name:'v', x:1, b:2, c:3},{name:'r', x:2, b:0, c:3},{name:'v', x:4, b:3, c:3}, {name:'v', x:1, b:1, c:3}];
let a = arr.reduce((acc,curr)=>{
if(!acc[curr.name]){
acc[curr.name]={name:curr.name,x:0, b:0, c:curr.c}
}
let keyArr = Object.keys(curr);
keyArr.forEach((k)=>{
if(k!=="name" && k!=="c"){
acc[curr.name][k] =curr[k]
}
})
return acc;
},{})
let result = Object.values(a)
console.log(result)
CodePudding user response:
Here is the answer for my question
var arr = [{v:'v', x:1, b:2, c:3},{v:'r', x:2, b:0, c:3},{v:'v', x:4, b:3, c:3},{v:'v', x:10, b:3, c:3},{v:'r', x:1, b:1, c:3},{v:'v', x:11, b:2, c:3},{v:'r', x:22, b:0, c:3}];
let arr2 = []
for(let j=0; j< arr.length;j ){
for(let i=j 1; i< arr.length; i ){
let obj = {v:null, x:null, b: null, c:null}
if(arr[j].v === arr[i].v ){
let a = arr.filter(({v})=> v === arr[j].v).reduce((a, b) => ({x: a.x b.x, b: a.b b.b}));
obj.v = arr[j].v
obj.x = a.x
obj.b = a.b
obj.c = arr[j].c
i= arr.length
console.log("DA", obj)
if(!arr2.some(item=> item.v === obj.v)){
arr2.push(obj)
}
} else if(i 1 === arr.length){
obj.v = arr[j].v
obj.x = arr[j].x
obj.b = arr[j].b
obj.c = arr[j].c
console.log("NE", obj)
if(!arr2.some(item=> item.v === obj.v)){
arr2.push(obj)
}
}
}
}
console.log(arr2, "REZ")