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

Javascript 将数组元素与数组的其余部分进行比较,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,这个问题可能有点模糊,但我会用一个例子来解释我期望得到的结果 假设我有一个由具有以下形状的对象组成的数组: [ { id: 1, value: 10 }, { id: 2, value: 100 }, { id: 3, value: 10 }, { id: 4, value: 10 }, { id: 5, value: 10

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

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

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

]
这个数组可能包含数百个,也许数千个条目,但为了简单起见,我将保持它的小规模

我试图实现的是将每个对象的
属性与其他
属性进行比较,并使用布尔值为该特定对象指定一个新属性
重复

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

[
  {
     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
  },

]
我实现这种行为的最佳方式是什么


谢谢。

我会在数组中做一次单次遍历,记住在
映射中第一个看到的具有给定值的条目,如果第一个条目(以及任何其他条目)存在,则将其标记为重复条目,如下所示:

const map=newmap();
for(数组的常量项){
const previous=map.get(entry.value);
如果(先前){
previous.duplicate=entry.duplicate=true;
}否则{
map.set(entry.value,entry);
}
}
实例:

const数组=[
{
id:1,
数值:10
},
{
id:2,
数值:100
},
{
id:3,
数值:10
},
{
id:4,
数值:10
},
{
id:5,
价值:1000
},
];
常量映射=新映射();
for(数组的常量项){
const previous=map.get(entry.value);
如果(先前){
previous.duplicate=entry.duplicate=true;
}否则{
map.set(entry.value,entry);
}
}

console.log(数组)您可以通过首先确定哪些是重复项,然后设置“重复”属性来完成此操作

counts = items.reduce((counter, item) => {
    if (counter[item.value] != null) {
        counter[item.value] += 1;
    } else {
        counter[item.value] = 1;
    }
    return counter;
}, {});
items.forEach((item) => {
    if (counter[item.value] > 1) {
        item['duplicate'] = true;
    }
});
在此之后,您可以检查项目,如果计数>=2,则设置“重复”属性

counts = items.reduce((counter, item) => {
    if (counter[item.value] != null) {
        counter[item.value] += 1;
    } else {
        counter[item.value] = 1;
    }
    return counter;
}, {});
items.forEach((item) => {
    if (counter[item.value] > 1) {
        item['duplicate'] = true;
    }
});
你可以使用和

const输入=[
{id:1,值:10},
{id:2,值:100},
{id:3,value:10},
{id:4,value:10},
{id:5,值:1000}
]
const output=input.map(条目=>{
if(input.filter(x=>x.value==entry.value).length>1){
返回{
重复:对,
进入
}
}
返回条目
})
console.log(输出)
来自的一个副本,带有一个循环和一个用于存储可见值的对象

这种方法返回一个新数组,并且不改变给定的数据

var data=[{id:1,value:10},{id:2,value:100},{id:3,value:10},{id:4,value:10},{id:5,value:1000}],
结果=data.map((seen=>({…o})=>{
如果(见表中的o值){
o、 重复=正确;
如果(见[o.value]){
已看到[o.value]。重复=真;
见[o.value]=假;
}
}其他所见[o.value]=o;
返回o;
})({}));
控制台日志(结果)

.as console wrapper{max height:100%!important;top:0;}
我将创建一个以值为键的映射,并创建一个ID列表作为值,然后在遍历整个映射并创建新映射后,将其解压回所需的形式,并为具有多个值的键添加重复项。

我认为这将对您有所帮助。arr是你的数组

arr.forEach(e=> {
  const dublicatedDataLenth = arr.filter(a => a.value == e.value).length;
  if(dublicatedDataLenth > 1){
    e.dublicate = true;
  }
})

它应该是您正在寻找的。

您是否有一些非最佳代码?如何定义条目是否为重复项?身份证?价值呢?还是id和值?@ChristianBaumann只是值而已。请访问,看看是什么和。做一些研究,搜索相关话题等;如果遇到问题,请发布您的尝试,使用
[]
代码段编辑器记录输入和预期输出。可以使用
计数器[item.value]=(计数器[item.value]| | 0)+1来简化条件。无需通过两次数组来完成此操作。(但这仍然是一种可行的方法。)@b9s-是的,它确实如此-请注意前面的
部分,其中标记了重复项。:-)这就是为什么它是一个
映射
,而不仅仅是一个
@b9s单击“showcodesnippet”检查可运行的代码段。