Javascript 在对象上使用下划线唯一
我想返回房间对象相同的唯一数组Javascript 在对象上使用下划线唯一,javascript,underscore.js,Javascript,Underscore.js,我想返回房间对象相同的唯一数组 var input = [ { position:{ room: { name: 'WC', number: '001' } } }, { position:{ room: { name: 'WC', number: '001' } } }, { position:{ room: {
var input = [
{
position:{
room: {
name: 'WC',
number: '001'
}
}
},
{
position:{
room: {
name: 'WC',
number: '001'
}
}
},
{
position:{
room: {
name: 'RWC',
number: '007'
}
}
}
];
因此,这份清单将是:
var input = [
{
position:{
room: {
name: 'WC',
number: '001'
}
}
},
{
position:{
room: {
name: 'RWC',
number: '007'
}
}
}
];
我试过这个:
var distinctRooms = _.uniq(input, function(input){
return input.position.room
});
但它会返回整个列表。没有看到任何比较对象的示例。使用_uniq可以做到这一点吗?只要没有循环结构,就可以使用JSON Stringify对每个房间属性进行深入比较
_.uniq(input, function(input){
return JSON.stringify(input.position.room)
});
房间对象是不同的。如果你认为房间的数量是相等的,你可以使用
var distinctRooms = _.uniq(input, function(input){
return input.position.room.number;
});
也许你应该看看这个,他迭代并创建一个具有唯一值的数组。使用提供深度对象比较的,可以创建一个将其应用于对象数组的函数,并从该函数创建一个混合 算法: 从列表中获取头元素的第一个元素,将其存储在结果中 迭代列表的其余部分(尾部),删除与第一个元素相等的每个元素 如果列表的其余部分不是空的,则将其传递到步骤1,否则返回结果 使用递归方法实现的代码:
_.mixin({
deepUniq: (function () {
var dedup = function (coll, result) {
var head = _.first(coll),
tail = _.reject(_.rest(coll), function (curr) {
return _.isEqual(curr, head);
});
result.push(head);
return (tail.length) ? dedup(tail, result) : result;
};
return function (coll) {
return dedup(coll, []);
};
})()
});
警告:这种方法的运行时间是指数级的,也就是说,对于嵌套很深的对象的长列表,它的运行速度会越来越慢。我的建议是比较不同解决方案的正确性和性能
免责声明:此解决方案基于非数组对象的属性,不保证以任何特定顺序进行字符串化。您是对的。我想您可以提取对象键,并使用u.sort提供排序副本。这似乎有点过分了:有没有一个徽章可以用来表示-1级的公认答案?应该有一个用于创建海森堡:@用户1572526请注意,您依赖的是未定义的行为:var isAlive=JSON.stringify{name:1,number:2}==JSON.stringify{number:2,name:1}-是纯量子力学:这将丢弃具有匹配号码的房间,即使名称不同,但OP不是这样asking@amenadiel你怎么知道OP有编号相同但名称不同的房间对我来说,这是一个不寻常的情况。这是我从小就有的礼物;