如何检查对象数组是否具有重复的属性值?

2022-08-30 05:15:44

我需要一些帮助来迭代数组,我不断陷入困境或重新发明轮子。

values = [
    { name: 'someName1' },
    { name: 'someName2' },
    { name: 'someName1' },
    { name: 'someName1' }
]

如何检查数组中是否有两个(或更多)相同的名称值?我不需要计数器,如果数组值不唯一,只需设置一些变量。请记住,数组长度是动态的,也是数组值。


答案 1

使用 array.prototype.maparray.prototype.some

var values = [
    { name: 'someName1' },
    { name: 'someName2' },
    { name: 'someName4' },
    { name: 'someName2' }
];

var valueArr = values.map(function(item){ return item.name });
var isDuplicate = valueArr.some(function(item, idx){ 
    return valueArr.indexOf(item) != idx 
});
console.log(isDuplicate);

答案 2

ECMA 脚本 6 版本

如果您处于支持 ECMA 脚本 6 的 Set 的环境中,则可以使用 Array.prototype.some 和对象,如下所示Set

let seen = new Set();
var hasDuplicates = values.some(function(currentObject) {
    return seen.size === seen.add(currentObject.name).size;
});

在这里,我们将每个对象都插入到 中,并检查添加之前和之后是否相同。这是有效的,因为返回基于唯一数据的数字(如果数据是唯一的,则 set 仅添加条目)。如果/当您有重复的名称时,大小不会增加(因为数据将不是唯一的),这意味着我们已经看到了当前名称,它将返回true。nameSetsizeSet.size


ECMA 脚本 5 版本

如果你没有支持,那么你可以使用一个普通的JavaScript对象本身,就像这样Set

var seen = {};
var hasDuplicates = values.some(function(currentObject) {

    if (seen.hasOwnProperty(currentObject.name)) {
        // Current name is already seen
        return true;
    }

    // Current name is being seen for the first time
    return (seen[currentObject.name] = false);
});

同样可以简明扼要地写出来,就像这样

var seen = {};
var hasDuplicates = values.some(function (currentObject) {
    return seen.hasOwnProperty(currentObject.name)
        || (seen[currentObject.name] = false);
});

注意:在这两种情况下,我们都使用,因为它会短路。当它从函数获得真实值时,它将立即返回,它不会处理其余元素。Array.prototype.sometrue