2013-12-23 36 views

回答

49

使用uniq功能

var destArray = _.uniq(sourceArray, function(x){ 
    return x.name; 
}); 

从文档:

可生产阵列的无重复的版本,使用===测试对象的相等。如果您事先知道数组已排序,则传递true以执行isSorted将运行更快的算法。如果您想基于转换计算唯一项目,请传递迭代器函数。

在上例中,该函数使用对象名称来确定唯一性。

+10

嗨,是否有可能检查多个属性上的唯一例如上述示例说,通过ID和名称都? –

+17

你也可以做'_.uniq(sourceArray,'name')' – kittyminky

+1

谢谢@kittyminky ... _things文档应该说_ – Dunc

1

如果你需要纯JavaScript解决方案:

var uniqueProperties = {}; 

var notUniqueArray = [ { id: 1, name: 'bob' }, { id: 1, name: 'bill' }, { id: 1, name: 'bill' } ]; 


for(var object in notUniqueArray){ 
    uniqueProperties[notUniqueArray[object]['name']] = notUniqueArray[object]['id']; 
} 

var uniqiueArray = []; 

for(var uniqueName in uniqueProperties){ 
    uniqiueArray.push(
    {id:uniqueProperties[uniqueName],name:uniqueName}); 
} 

//uniqiueArray 
+0

一个纯Javascript的解决方案。像替代 –

+0

似乎对我来说是错误的。你假设一个属性名称只会出现一次? – hasen

+0

@hasen我想你在这里没有想法。在浏览器控制台中执行代码或再次读取OP问题。 – gotqn

6

如果要检查所有的属性然后 lodash 4自带_.uniqWith(sourceArray,_.isEqual)

+5

2+属性如何,但不是所有属性? –

7

如果你更喜欢自己做没有Lodash的东西,并且没有得到详细的,尝试这个uniq过滤器与可选的uniq属性:

const uniqFilterAccordingToProp = function (prop) { 
    if (prop) 
     return (ele, i, arr) => arr.map(ele => ele[prop]).indexOf(ele[prop]) === i 
    else 
     return (ele, i, arr) => arr.indexOf(ele) === i 
} 

然后,使用这样的:

const obj = [ { id: 1, name: 'bob' }, { id: 1, name: 'bill' }, { id: 1, name: 'bill' } ] 
obj.filter(uniqFilterAccordingToProp('abc')) 

或者对于普通数组,只是省略该参数,一边回忆调用:

[1,1,2].filter(uniqFilterAccordingToProp())

1

可以使用uniq功能

var array = [ { id: 1, name: 'bob' }, { id: 2, name: 'bill' }, { id: 1, name: 'bill' },{ id: 2, name: 'bill' } ]; 
 

 
var filteredArray = _.uniq(array,function(x){ return x.id && x.name;}); 
 

 
console.log(filteredArray)

 
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

在上面的例子中,过滤是基于属性ID &名称组合的唯一性。

如果您有一个对象的多个属性。 然后根据特定属性找到唯一的对象数组,您可以按照这种方法在_uniq()方法内组合属性。

相关问题