将数组元素与数组的其余部分进行比较

As *_*low -1 javascript arrays ecmascript-6

这个问题可能有点含糊,但我会用一个例子来解释我期望得到的结果。

假设我有以下数组由具有以下形状的对象组成:

[
   {
      id: 1,
      value: 10
   },
   {
      id: 2,
      value: 100
   },
   {
      id: 3,
      value: 10
   },
   {
      id: 4,
      value: 10
   },
   {
      id: 5,
      value: 1000
   },

]
Run Code Online (Sandbox Code Playgroud)

这个数组可能包含数百个,也可能包含数千个条目,但为了简单起见,我会保持它很小。

我想要实现的是将value每个对象的value属性与其他属性进行比较,并为该duplicate特定对象分配一个具有布尔值的新属性。

鉴于上面的示例,我希望收到一个包含以下成员的数组:

[
  {
     id: 1,
     value: 10,
     duplicate: true
  },
  {
     id: 2,
     value: 100
  },
  {
     id: 3,
     value: 10,
     duplicate: true
  },
  {
     id: 4,
     value: 10,
     duplicate: true
  },
  {
     id: 5,
     value: 1000
  },

]
Run Code Online (Sandbox Code Playgroud)

我可以实现这种行为的最佳方式是什么?

谢谢你。

T.J*_*der 5

我会在数组中执行一次遍历,记住第一个看到的具有给定值的条目 a Map,如果第一个条目(和任何其他条目)存在,则将其标记为重复项,如下所示:

const map = new Map();
for (const entry of array) {
    const previous = map.get(entry.value);
    if (previous) {
        previous.duplicate = entry.duplicate = true;
    } else {
        map.set(entry.value, entry);
    }
}
Run Code Online (Sandbox Code Playgroud)

现场示例:

const array = [
   {
      id: 1,
      value: 10
   },
   {
      id: 2,
      value: 100
   },
   {
      id: 3,
      value: 10
   },
   {
      id: 4,
      value: 10
   },
   {
      id: 5,
      value: 1000
   },

];

const map = new Map();
for (const entry of array) {
    const previous = map.get(entry.value);
    if (previous) {
        previous.duplicate = entry.duplicate = true;
    } else {
        map.set(entry.value, entry);
    }
}

console.log(array);
Run Code Online (Sandbox Code Playgroud)