我有这个数组:
[{name: 'Brad', age: 30, isOlder: true, youngerBrother: 'Oleg'}, {name: 'Brad', age: 30, isOlder: false, youngerBrother: 'Michael'}]
我想检查列表中的项目是否被特定键重复。
例如-如果名称,年龄在列表上相同,则重复行,而无需注意isOlder或youngerBrother。
我尝试使用lodash _uniq,但是没有排除键/注意特定键的选项
最佳答案
您可以使用.filter()
和.some()
:
var list = [
{name: 'Brad', age: 30, isOlder: true, youngerBrother: 'Oleg'},
{name: 'Brad', age: 30, isOlder: false, youngerBrother: 'Michael'}
];
list = list.filter(function(outer, oPos) {
return !list.some(function(inner, iPos) {
return iPos > oPos && inner.name == outer.name && inner.age == outer.age;
});
});
console.log(list);
但是,直接在
oPos + 1
处启动内部循环会更有效:var list = [
{name: 'Brad', age: 30, isOlder: true, youngerBrother: 'Oleg'},
{name: 'Brad', age: 30, isOlder: false, youngerBrother: 'Michael'}
];
list = list.filter(function(outer, oPos) {
for(var iPos = oPos + 1; iPos < list.length; iPos++) {
if(list[iPos].name == outer.name && list[iPos].age == outer.age) {
return false;
}
}
return true;
});
console.log(list);
另外,我们可以在
.filter()
中进行迭代时构建遇到的组合键的列表。大多数浏览器应将if(keyList[key])
实现为在哈希表中的查找,因此速度非常快。var list = [
{name: 'Brad', age: 30, isOlder: true, youngerBrother: 'Oleg'},
{name: 'Brad', age: 30, isOlder: false, youngerBrother: 'Michael'}
];
var keyList = {};
list = list.filter(function(obj) {
var key = obj.name + '|' + obj.age;
if(keyList[key]) {
return false;
}
keyList[key] = true;
return true;
});
console.log(list);
关于javascript - 从数组中删除重复的对象,但不包括JavaScript中的特定键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38684528/