我有一个类cars
的Parse模型的简单数组Cars
当我这样做时
var uniqCars = _.uniq(cars);
它没有用。 uniqCars
与cars
完全相同。 cars
的长度为5,uniqCars
的长度为5(当它应为2时)。
然而,当我这样做时:
var uniqCars = _.uniq(cars,
function (c) {
return c.id;
});
有效。我的问题是,为什么它不与前者合作并与后者合作?为什么我必须如此冗长?这是Parse还是下划线的问题?
答案 0 :(得分:2)
为什么它不适用于前者
因为,如果您没有通过比较器功能,它默认使用===
运算符来比较对象。引用_.uniq
文档,
生成数组的无副本版本,使用===测试对象相等性。 ... 如果您想根据转化计算唯一项目,请传递一个iteratee函数
使用===
(Strict Equality operator)时,除非它们是同一个对象或相同的字符序列形成一个字符串,否则两个对象不会相同。例如,
console.assert(({} === {}) === false);
var obj = {};
console.assert(obj === obj);
console.assert("ab" === "a" + "b")
console.assert("ab" === 'a' + "b")
因此,它不是Parse特有的,但它是JavaScript中的预期行为。
答案 1 :(得分:1)
使用严格的相等性进行比较。除非对数组中的同一个对象有多个引用,否则它们不会完全相同。
使用===生成数组的无副本版本,以测试对象相等性。特别是仅保留每个值的第一次出现。如果您事先知道数组已排序,则为isSorted传递true将运行更快的算法。如果要根据转换计算唯一项,请传递iteratee函数。