JS lodash uniq无法与ObjectID列表一起使用

时间:2019-03-01 11:46:01

标签: lodash objectid

我有一个猫鼬模型集合,我尝试使用uniq lodash函数从列表中获取唯一的id,但仍然得到相同的列表。

列表元素为https://docs.mongodb.com/manual/reference/method/ObjectId/

const uniqueIds = uniq(ids) // not working

输入:

[ 
  5c6f98ceb3f013291b497d82,
  5c6e447147c75d699f0514a1,
  5c6e447147c75d699f0514a1,
  5c6e447147c75d699f0514a1,
  5c6f98cfb3f013291b497d89,
  5c6f98cfb3f013291b497d89,
  5c6f98cfb3f013291b497d89,
  5c6f98cfb3f013291b497d89,
  5c6f98cfb3f013291b497d89,
  5c6f98cfb3f013291b497d89 
]

输出:

    [ 
      5c6f98ceb3f013291b497d82,
      5c6e447147c75d699f0514a1,
      5c6e447147c75d699f0514a1,
      5c6e447147c75d699f0514a1,
      5c6f98cfb3f013291b497d89,
      5c6f98cfb3f013291b497d89,
      5c6f98cfb3f013291b497d89,
      5c6f98cfb3f013291b497d89,
      5c6f98cfb3f013291b497d89,
      5c6f98cfb3f013291b497d89
    ]

4 个答案:

答案 0 :(得分:1)

由于这些项目是ObjectId的实例,因此您不能使用_.uniq(),因为不同的对象实例始终是唯一的。您可以使用lodash的_.uniqBy(),并将对象的str属性作为唯一标识符:

_.uniqBy(list, 'str')

答案 1 :(得分:1)

问题在于这些对象是ObjectId对象,并且可能为相同的哈希生成了一个新对象,因此在这种情况下,引用不一样,则可能会发生以下情况:

ObjectId("foo") == ObjectId("foo"); // false

在这种情况下,uniq()将无法识别相同的ObjectId。一种解决方案是使用A Deep Dive into Kubernetes Metrics来正确比较它们,例如:

_.uniqBy(ids, id => id.valueOf());

答案 2 :(得分:0)

假设列表是数组,列表中的每个元素都是ObjectId,则应该可以使用。列表中的每个id都会被迭代并转换为用于查找唯一元素的字符串

_.uniqBy(list, (id) => id.toString())

答案 3 :(得分:0)

这甚至适用于objectId数组

 function onlyUnique(value, index, self) { 
      return self.indexOf(value) === index;
    }
    
    const uniqueArray=yourArray.filter(onlyUnique);