JS lodash uniq 不使用 ObjectID 列表

JS lodash uniq not woking with ObjectID list

我有一个 mongoose 模型集合,我尝试使用 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, you can't use _.uniq() because different object instances are always unique. You can use lodash's _.uniqBy() 的实例,因此对象的 str 属性 作为唯一标识符:

_.uniqBy(list, 'str')

问题是这些是 ObjectId 个对象,可能会为相同的散列生成一个新对象,因此在这种情况下,引用不相同可能会发生以下情况:

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

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

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

假设列表是数组,列表中的每个元素都是ObjectId,这应该可以。列表中的每个 id 将被迭代并转换为 sting 以查找唯一元素

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

这甚至适用于 objectId 数组

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