【问题标题】:Examine duplicate elements in two arrays in JavaScript [duplicate]在 JavaScript 中检查两个数组中的重复元素 [重复]
【发布时间】:2021-12-01 09:42:20
【问题描述】:

我有两个数组,我希望将这两个组合起来,重复项不会亮起,只添加新项,我在控制台中看到组合数组 我还想在控制台的列表中查看重复项 我的意思是,我需要两个输出,一个告诉我重复是什么,一个告诉我一个新的数组,该数组由两个没有重复的数组组合而成。 我写了这段代码,但它不能正常工作 谢谢你指导我

预期输出:

newContact : [
  {
    "id": 1,
    "name": "Oliver"
  },
  {
    "id": 2,
    "name": "Liam"
  }
   {
    "id": 3,
    "name": "James"
  }
   {
    "id": 4,
    "name": "Lucas"
  }
]
duplicateContacts: Oliver

let array1 = [
  { id: 1, name: "Oliver" },
  { id: 2, name: "Liam" },
];
let array2 = [
  { id: 1, name: "Oliver" },
  { id: 3, name: "James" },
  { id: 4, name: "Lucas" },
];
let newContact = array1.filter((item) => item.id !== array2.id);
console.log("newContact :", newContact);
console.log("duplicateContacts:");

【问题讨论】:

  • array2 没有id 的属性?您的意思是要与 array2 中等效索引中的项目进行比较?
  • 请添加想要的结果。如果array1 有另一个对象,在array2 中不匹配,会发生什么?
  • 如何判断是重复的?只是身份证?
  • @mouxiaochou 是id
  • @NinaScholz 我把预期的输出,请检查

标签: javascript ecmascript-6


【解决方案1】:

猜测重复表示相同的id,将数组条目添加到映射以查找重复项,并且映射包含唯一项

const array1 = [
  { id: 1, name: "Oliver" },
  { id: 2, name: "Liam" },
];
const array2 = [
  { id: 1, name: "Oliver" },
  { id: 3, name: "James" },
  { id: 4, name: "Lucas" },
];

const duplicates = [];
const map = new Map();

const fill = (array) => array.forEach(item => {
  if (map.has(item.id)) {
    duplicates.push(item);
  } else {
    map.set(item.id, item);
  }
});

fill(array1);
fill(array2);

console.log(duplicates);
console.log([...map.values()]);

编辑

要将数组作为输入,请创建一个函数

const inspect = (...arrays) => {
    const duplicates = [];
    const map = new Map();

    const fill = (array) => array.forEach(item => {
      if (map.has(item.id)) {
        duplicates.push(item);
      } else {
        map.set(item.id, item);
      }
    });

    arrays.forEach(array => fill(array));

    console.log(duplicates);
    console.log([...map.values()]);
};


const array1 = [
  { id: 1, name: "Oliver" },
  { id: 2, name: "Liam" },
];
const array2 = [
  { id: 1, name: "Oliver" },
  { id: 3, name: "James" },
  { id: 4, name: "Lucas" },
];

inspect(array1, array2);

【讨论】:

  • 您的代码符合我的预期,但是fill 函数可以不被调用两次并且不需要调用吗?并自己给它输入
  • @Good 查看答案中的编辑,您可以创建一个函数来接受您的数组作为输入
【解决方案2】:

您可以从 array2 和所有 id 中获取 Set 并过滤另一个数组。

const
    array1 = [{ id: 1, name: "Oliver" }, { id: 2, name: "Liam" }],
    array2 = [{ id: 1, name: "Oliver" }, { id: 3, name: "James" }, { id: 4, name: "Lucas" }],
    set2 = new Set(array2.map(({ id }) => id)),
    duplicateContacts = array1.filter(({ id }) => set2.has(id));
    allContacts = [...array1, ...array2].filter(
        (s => ({ id }) => !s.has(id) && s.add(id))
        (new Set)
    ),

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

【讨论】:

  • 他想要第一个数组中的 1,2,3,4
【解决方案3】:

三种方法:

  • filter 获取重复元素数组

  • map 只恢复一列的数组

  • some 描述如何比较数组中的对象

     const duplicates = array1.filter(value => array2.some(oneElement => oneElement.id === value.id));
    const duplicatesId = array1.filter(value => array2.some(oneElement => oneElement.id === value.id)).map(oneElement => oneElement.id);
    
    
    const mergedArray = [ 
     ...array1, 
     ...array2.filter(value => !duplicatesId.some(oneDuplicate => oneDuplicate === value.id))
    ];
    

const array1 = [
  { id: 1, name: "Oliver" },
  { id: 2, name: "Liam" },
];

const array2 = [
  { id: 1, name: "Oliver" },
  { id: 3, name: "James" },
  { id: 4, name: "Lucas" },
];

const duplicates = array1.filter(value => array2.some(oneElement => oneElement.id === value.id));
const duplicatesId = array1.filter(value => array2.some(oneElement => oneElement.id === value.id)).map(oneElement => oneElement.id);


const mergedArray = [ 
  ...array1, 
  ...array2.filter(value => !duplicatesId.some(oneDuplicate => oneDuplicate === value.id))
];

console.log(duplicates);
console.log(duplicatesId);
console.log(mergedArray);

【讨论】:

  • 重复项没有告诉我是哪一项
  • 我编辑我的回复,你可以让它们与另一个变量一起使用
  • 我测试了你的代码,它给了我一个空数组,请检查,谢谢
  • 我编辑我的回复以获得正确答案
  • 我们不能使用 array1.includes(valueFromArray2) 因为包括检查对象在内存中是否相等并且形状不同stackoverflow.com/questions/49187940/…
猜你喜欢
  • 2021-12-23
  • 2017-03-11
  • 2016-08-06
  • 2017-06-07
  • 1970-01-01
  • 2018-09-17
  • 2021-03-11
  • 2023-03-19
  • 2011-06-19
相关资源
最近更新 更多