我有一个对象数组,我想从它得到一个新的数组,只基于一个属性,是否有一个简单的方法来实现这一点?我怎样才能得到一个独特的数组基于对象属性使用下划线
例如,
[ { id: 1, name: 'bob' }, { id: 1, name: 'bill' }, { id: 1, name: 'bill' } ]
会导致2个名称= bill的对象被删除一次。
我有一个对象数组,我想从它得到一个新的数组,只基于一个属性,是否有一个简单的方法来实现这一点?我怎样才能得到一个独特的数组基于对象属性使用下划线
例如,
[ { id: 1, name: 'bob' }, { id: 1, name: 'bill' }, { id: 1, name: 'bill' } ]
会导致2个名称= bill的对象被删除一次。
使用uniq功能
var destArray = _.uniq(sourceArray, function(x){
return x.name;
});
从文档:
可生产阵列的无重复的版本,使用===测试对象的相等。如果您事先知道数组已排序,则传递true以执行isSorted将运行更快的算法。如果您想基于转换计算唯一项目,请传递迭代器函数。
在上例中,该函数使用对象名称来确定唯一性。
如果你需要纯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
如果要检查所有的属性然后 lodash 4自带_.uniqWith(sourceArray,_.isEqual)
2+属性如何,但不是所有属性? –
如果你更喜欢自己做没有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())
可以使用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()方法内组合属性。
嗨,是否有可能检查多个属性上的唯一例如上述示例说,通过ID和名称都? –
你也可以做'_.uniq(sourceArray,'name')' – kittyminky
谢谢@kittyminky ... _things文档应该说_ – Dunc