JS lodash uniq不用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
    ]

问题是这些是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);

最新更新