从阵列中删除重复的对象在JavaScript
问题描述:
排除特定键我有此数组:从阵列中删除重复的对象在JavaScript
[{name: 'Brad', age: 30, isOlder: true, youngerBrother: 'Oleg'}, {name: 'Brad', age: 30, isOlder: false, youngerBrother: 'Michael'}]
我想检查清单上的项目是由特定键复制。
例如 - 如果名称,年龄在列表中相同,行重复,而不注意isOlder或更年轻的兄弟。
我试图用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);
答
请试试这个
function isDuplicate(ArrayVar) {
var tempObj = {};
for (var key in ArrayVar) {
if (object.hasProperty(ArrayVar[key].name)) {
return true;
}
obj[ArrayVar[key].name] = true;
}
return false;
}
答
您可以使用Array.prototype.filter
var data = [
{name: 'Brad', age: 30, isOlder: true, youngerBrother: 'Oleg'},
{name: 'Brad', age: 30, isOlder: false, youngerBrother: 'Michael'}
];
function distinctByField(arr, field) {
var result = arr.filter(function(item) {
var key = item[field];
return this[key] ? false : (this[key] = true);
}, Object.create(null));
return result;
}
console.log(distinctByField(data, 'age'));
答
这里是这样做的一个选项:
arr = [
{name: 'Brad', age: 30, isOlder: true, youngerBrother: 'Oleg'},
{name: 'Brad', age: 30, isOlder: false, youngerBrother: 'Michael'}
];
var result = checkDuplicateKeys(arr[0], arr[1], ['name', 'age']);
console.log(result);
function checkDuplicateKeys(obj1, obj2, keyList) {
var propertyDuplicateCounter = 0;
var result = false;
for (var i=0; i<keyList.length; i++) {
if (obj1.hasOwnProperty(keyList[i]) && obj2.hasOwnProperty(keyList[i])) {
propertyDuplicateCounter += 1;
}
}
if (propertyDuplicateCounter == keyList.length) {
result = true;
}
return result;
}
答
你可以使用lodash _.uniqBy(arr,'key')
它会适合你,因为你已经在使用lodash
答
你可以使用Array#some
如果name
- age
任何两个或多个对象在同一它将返回true
其他false
var ar = [{name: 'Brad', age: 30, isOlder: true, youngerBrother: 'Oleg'}, {name: 'Brad', age: 30, isOlder: false, youngerBrother: 'Michael'}];
var result = ar.some(function(e) {
if(!this[e.name + '|' + e.age]) {
this[e.name + '|' + e.age] = true;
} else {
return true;
}
}, {});
console.log(result)
请检查:http://stackoverflow.com/questions/27854705/how-to-get-duplicates-in-a-javascript-array-using-underscore –