I have been stuck trying to implement this forever. do you think you could help me out merging two array objects based on the key PartitionKey
and if the PartitionKey
don't match up, still add it to the array anyway?
let arr1 =[
{ PartitionKey: '047', AttributionCount: 61 },
{ PartitionKey: '043', AttributionCount: 136 },
{ PartitionKey: '053', AttributionCount: 36 }
];
let arr2 = [
{ PartitionKey: '043', ReportCount: 5 },
{ PartitionKey: '047', ReportCount: 2 },
{ PartitionKey: '045', ReportCount: 2 },
{ PartitionKey: '041', ReportCount: 3 }
]
let arr3 = arr1.map((item, i) => Object.assign({}, item, arr2[i]));
console.log(arr3);
I would like to return the result of
[
{ PartitionKey: '047', ReportCount: 2, AttributionCount: 61 },
{ PartitionKey: '043', ReportCount: 5, AttributionCount: 136 },
{ PartitionKey: '053', ReportCount: 0, AttributionCount: 36 },
{ PartitionKey: '045', ReportCount: 2, AttributionCount: 0},
{ PartitionKey: '041', ReportCount: 3, AttributionCount: 0}
]
CodePudding user response:
my way...
let arr1 =
[ { PartitionKey: '047', AttributionCount: 61 }
, { PartitionKey: '043', AttributionCount: 136 }
, { PartitionKey: '053', AttributionCount: 36 }
]
let arr2 =
[ { PartitionKey: '043', ReportCount: 5 }
, { PartitionKey: '047', ReportCount: 2 }
, { PartitionKey: '045', ReportCount: 2 }
, { PartitionKey: '041', ReportCount: 3 }
]
const result =
Object.entries(
arr1
.concat(arr2)
.reduce((res,{PartitionKey,...info}) =>
{
if (!res[PartitionKey]) res[PartitionKey] = info
else Object.assign(res[PartitionKey], info )
return res
}
,{})
).map( ([k,v]) =>
({PartitionKey:k, AttributionCount:0, ReportCount:0, ...v}))
console.log( result )
.as-console-wrapper {max-height: 100%!important;top:0 }
CodePudding user response:
You can do it like this:
let arr1 =[
{ PartitionKey: '047', AttributionCount: 61 },
{ PartitionKey: '043', AttributionCount: 136 },
{ PartitionKey: '053', AttributionCount: 36 }
];
let arr2 = [
{ PartitionKey: '043', ReportCount: 5 },
{ PartitionKey: '047', ReportCount: 2 },
{ PartitionKey: '045', ReportCount: 2 },
{ PartitionKey: '041', ReportCount: 3 }
]
let arr3 = arr2.map((item, i) => {
const itemArray1 = arr1.find(x => x.PartitionKey == item.PartitionKey) || {AttributionCount: 0}
return {...item, ...itemArray1}
});
console.log('arr3', arr3);
CodePudding user response:
Try using object.assign()
method for this problem.
e.g: const returnedTarget = Object.assign(target, source);
reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
CodePudding user response:
Try this, the benchmark is good.
let arr1 = [
{ PartitionKey: '047', AttributionCount: 61 },
{ PartitionKey: '043', AttributionCount: 136 },
{ PartitionKey: '053', AttributionCount: 36 },
];
let arr2 = [
{ PartitionKey: '043', ReportCount: 5 },
{ PartitionKey: '047', ReportCount: 2 },
{ PartitionKey: '045', ReportCount: 2 },
{ PartitionKey: '041', ReportCount: 3 },
];
let map = new Map();
[...arr1, ...arr2].forEach((item) => {
let itemPk = item.PartitionKey;
map.set(itemPk, { PartitionKey: 0, ReportCount: 0, AttributionCount: 0, ...map.get(itemPk), ...item });
});
let result = Array.from(map.values());
console.log(result);