【问题标题】:Comparing two arrays of objects and return final result比较两个对象数组并返回最终结果
【发布时间】:2020-07-31 10:14:03
【问题描述】:

我有两个对象数组(array1,array2)。我正在尝试返回最终数组(如下所示),它消除了 array2 中的重复项,但不是 array1。我优先考虑array1。

array1 =[
    { phone: "07485454", name: "John" },
    { phone: "054554", name: "Ryan" },
]

array2 =[
    { phone: "2144564", name: "John" },
    { phone: "286456", name: "Mike" },
]

这是我想要的最终结果。仅从 array2 中删除重复项。 最终数组:

[
   { phone: "07485454", name: "John" },
   { phone: "054554", name: "Ryan" },
   { phone: "286456", name: "Mike" },
]

这是我尝试过的:

for(let i = 0; i < array1.length; i++) {
    let name = array1[i].name;
  for(let a = 0; i < array2.length; a++) {
      let newname = array2[a].name;
      if(name !== newname) {
       array1.push(
         {
           phone: array2[a].phone,
           name: array2[a].name
         });
      }
    
    console.log(array1);
  }
  
}

这是我得到的错误。

"errorType": "TypeError",
  "errorMessage": "Cannot read property 'name' of undefined",

【问题讨论】:

  • 嗨,首先:欢迎来到 Stackoverflow!如果你多写一些关于你已经尝试过的事情,那将是非常有帮助和伟大的:什么没用,你遇到了什么错误,你在哪里卡住了?现在,这个问题似乎是您要求其他人为您完成实施工作,这并不是堆栈溢出的真正目的。
  • @DavidLosert 道歉菜鸟错误
  • @DalalV 你的for(let a = 0; i &lt; array2.length; a++) { 有一个轻微的错字。它应该使用a &lt; array2.length。另外,您有几个逻辑错误,请尝试更新您的代码并调试正在发生的事情!

标签: javascript arrays object


【解决方案1】:

您已经接近解决方案,您可以创建一个 Set 来包含您的 array1 元素的名称并将 array1 元素推送到您的 result 数组;随后将 array2 的元素添加到 set 中不包含的名称到 result 数组中:

function removeDuplicates(array1, array2) {
    const result = [];
    const set = new Set();

    for (const elem of array1) {

        result.push(elem);
        set.add(elem.name);
    } 

    for (const elem of array2) {

        if (!set.has(elem.name)) {

            result.push(elem);
        }
    }

    return result;
    
}

const array1 =[
    { phone: "07485454", name: "John" },
    { phone: "054554", name: "Ryan" }
];

const array2 =[
    { phone: "2144564", name: "John" },
    { phone: "286456", name: "Mike" }
];

console.log(JSON.stringify(removeDuplicates(array1, array2)));

【讨论】:

    【解决方案2】:

    您在内部 for 循环条件 a

    中犯了错字

    改变array1的长度会导致无限循环

    每一次,当if(name !== newname)条件为真时,在array1中插入一个新对象会导致array1长度发生变化。

    let array1 =[
        { phone: "07485454", name: "John" },
        { phone: "054554", name: "Ryan" },
    ]
    
    let array2 =[
        { phone: "2144564", name: "John" },
        { phone: "286456", name: "Mike" },
    ]
    
    let result = array2.reduce((accumulator, currentItem) =>{
         let index = accumulator.findIndex(item => item.name === currentItem.name);
         if(index === -1){
            accumulator.push(currentItem); 
         } 
        return accumulator;
        },array1);
    
    console.log(result);

    【讨论】:

      猜你喜欢
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      • 2020-08-07
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多