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有编号相同但名称不同的房间对我来说,这是一个不寻常的情况。这是我从小就有的礼物;