2016-07-31 52 views
2

排除特定键我有此数组:从阵列中删除重复的对象在JavaScript

[{name: 'Brad', age: 30, isOlder: true, youngerBrother: 'Oleg'}, {name: 'Brad', age: 30, isOlder: false, youngerBrother: 'Michael'}] 

我想检查清单上的项目是由特定键复制。

例如 - 如果名称,年龄在列表中相同,行重复,而不注意isOlder或更年轻的兄弟。

我试图用lodash _uniq但没有选项排除键/关注的特定键

+0

请检查:http://stackoverflow.com/questions/27854705/how-to-get-duplicates-in-a-javascript-array-using-underscore –

回答

3

您可以使用.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);

2

请试试这个

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; 
} 
1

您可以使用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'));

2

这里是这样做的一个选项:

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; 
} 
3

你可以使用lodash _.uniqBy(arr,'key')它会适合你,因为你已经在使用lodash

2

你可以使用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)