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);
我有一个 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);