来自underscore.js documentation:
uniq _.uniq(array, [isSorted], [iteratee]) 别名:unique
产生一个
数组的无重复版本,使用 === 来测试对象
平等。如果您事先知道数组已排序,则传递
isSorted 的 true 将运行更快的算法。如果你想
根据转换计算唯一项,传递一个迭代对象
功能。
但数组在 JavaScript 中不能严格比较。
因此,您可以使用转换函数来与uniq 进行比较。例如:
console.log([1,2] === [1,2]) // false, can't strict compare arrays
console.log([1,2].toString()) // "1,2" - string representation
console.log([1,2].toString() === [1,2].toString()) // true, strings can be compared
var valueToString = function(v) {return v.toString()}; // transform array to string
var arr1 = [[1,2], [2,3], [1,2]];
var arr2 = _.uniq(arr1, false, valueToString); // compare based on transformation
var arraysAreEqual = _.isEqual(arr1, arr2);
console.log("arraysAreEqual:", arraysAreEqual, arr1, arr2);
// false
// [[1, 2], [2, 3], [1, 2]]
// [[1, 2], [2, 3]]
注意转换为字符串是“hacky”:您最好比较数组的每个值,如this StackOverflow question 中所述。
通过在该问题中使用建议的equals 实现,您需要实现自己的uniq 版本,该版本使用equals 而不是===。
implementation of uniq in Underscore 非常简单——它创建一个新的result 数组并循环遍历给定的数组。如果当前值不在结果中,则插入它。
console.log("Using array comparison:");
arrayEquals = function (array1, array2) {
// if any array is a falsy value, return
if (!array1 || !array2)
return false;
// compare lengths - can save a lot of time
if (array1.length != array2.length)
return false;
for (var i = 0, l=array1.length; i < l; i++) {
// Check if we have nested arrays
if (array1[i] instanceof Array && array2[i] instanceof Array) {
// recurse into the nested arrays
if (!arrayEquals(array1[i],array2[i]))
return false;
}
else if (array1[i] !== array2[i]) {
return false;
}
}
return true;
};
_.uniqArrays = function(array) {
if (array == null) return [];
var result = [];
for (var i = 0, length = array.length; i < length; i++) {
var value = array[i];
var arrayEqualsToValue = arrayEquals.bind(this, value); // arrayEquals with first argument set to value
var existing = _.find(result, arrayEqualsToValue); // did we already find this?
if (!existing) {
result.push(value);
}
}
return result;
};
var arr3 = _.uniqArrays(arr1);
arraysAreEqual = _.isEqual(arr1, arr3);
console.log("arraysAreEqual:", arraysAreEqual, arr1, arr3); // false
我发了jsbin with all the code,如果你想玩的话。