我有一个猫鼬模型的集合,我尝试使用 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
]
问题是这些是ObjectId
对象,并且可能是同一哈希的新对象,因此,在这种情况下,参考文献不一样,以下可能会发生:
ObjectId("foo") == ObjectId("foo"); // false
在这种情况下,uniq()
将无法识别相同的ObjectId
。解决方案是使用uniqBy()
正确比较它们,例如:
_.uniqBy(ids, id => id.valueOf());
由于项目是ObjectID的实例,因此您不能使用_.uniq()
,因为不同的对象实例始终是唯一的。您可以将lodash的 _.uniqBy()
与对象的 str
属性一起用作唯一标识符:
_.uniqBy(list, 'str')
提供列表是数组,列表中的每个元素都是objectid,这应该有效。列表中的每个ID将迭代并转换为sting以查找唯一元素
_.uniqBy(list, (id) => id.toString())
这甚至适用于objectid arrays
function onlyUnique(value, index, self) {
return self.indexOf(value) === index;
}
const uniqueArray=yourArray.filter(onlyUnique);