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”检查可运行的代码段。