连接两个对象数组,并从属性中删除重复的数据

时间:2020-07-29 20:36:05

标签: javascript arrays

我有2个对象数组。一个数组从API接收数据并将其呈现在应用程序中,另一个数组从localStorage接收数据,这些数据是第一个数组的数据,已经更改并存储在localStorage中。我想连接这两个数组,但是我需要删除重复的数据,以免两次渲染同一对象。

我希望的例子:

dado1 = [
  {customer: {
    purchased: false,
    id: 1
  }}, 
  {customer: {
      purchased: false,
      id: 2
  }}
]

dado2 = [
  {customer: {
    purchased: true,
    id: 1
  }}
]

dado3 = dado1.concat (dado2)

result: 
dado3 = [
  {customer: {
    purchased: true,
    id: 1
  }}, 
  {customer: {
    purchased: false,
    id: 2
  }}
]

我无法比较两个数组。我想过几种方法,但我总是失败

3 个答案:

答案 0 :(得分:0)

类似的东西吗?

const dado1 = 
      [ { customer: { purchased: false, id: 1 } } 
      , { customer: { purchased: false, id: 2 } } 
      ] 
const dado2 = 
      [ { customer: { purchased: true, id: 1 } } 
      ] 


const dado3 = dado1.map(el=>
  {
  let nv = dado2.find(x=>x.customer.id === el.customer.id )
  return nv? nv : el
  })

console.log(  dado3  )
.as-console-wrapper { max-height: 100% !important; top: 0; }

但是要充实,这是对象的对象数组,所以更喜欢使用

const dado3 = dado1.map(el=>
  {
  let nv = dado2.find(x=>x.customer.id === el.customer.id )
  return nv? JSON.parse(JSON.stringify(nv)) : JSON.parse(JSON.stringify(el))
  })

如果您想要一个真正的新数组

答案 1 :(得分:0)

您可以通过在id字段中进行映射来确保客户对象的唯一性,并确保来自第二个对象的条目具有优先权(相对于api结果,这将首选本地存储):

let mergeCustomerData = (arr1, arr2) => {
  
  // Both arrays are converted to maps, where the `item.customer.id` property determines the key
  [ arr1, arr2 ] = [ arr1, arr2 ].map(arr => new Map(arr.map(v => [ v.customer.id, v ])));
  
  // Merge these Maps into one (preference determined by the order of `arr1` and `arr2`)
  let merged = new Map([ ...arr1, ...arr2 ]);
  
  // Return the merged values, converted back to an Array
  return [ ...merged ].map(([ id, v ]) => v);
  
};

let dado1 = [
  { customer: { purchased: false, id: 1 } }, 
  { customer: { purchased: false, id: 2 } }
];

let dado2 = [
  { customer: { purchased: true, id: 1 } }
];

console.log(mergeCustomerData(dado1, dado2));

答案 2 :(得分:0)

从第二个数组中收集ID。作为结果,第二个数组加上第一个数组中所有ID不在存储的ID中的元素。

dado1 = [
  {customer: { purchased: false, id: 1 }}, 
  {customer: { purchased: false, id: 2 }}
];

dado2 = [
  {customer: { purchased: true, id: 1 }},
  {customer: { purchased: true, id: 5 }}
];

function concatDado( dado1, dado2) {
    let result = dado2;
  let ids = [];
  dado2.forEach(element => ids.push(element.customer.id));
 
  dado1.forEach(element => {
    id = element.customer.id;
    if ( ids.indexOf(id) == -1 )
        result.push(element);
  });
  
  return result;
}
 
console.log( concatDado( dado1, dado2));