Home > Mobile >  How do I compare and combine two object array into one?
How do I compare and combine two object array into one?

Time:12-18

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);

  • Related