关于How to compare arrays in JavaScript?还有其他问题。我想知道的是编写/使用三维比较函数最简单的方法,如Array.sort()所需的那样。以下是使用默认效果不佳的示例:
> [ [4,5,10], [4,5,6], [4,1,2] ].sort() // no compare function, uses the default one
[ [ 4, 1, 2 ],
[ 4, 5, 10 ], // oops, string sorting makes 10 < 6
[ 4, 5, 6 ] ]
这就是我提出的:
// return -1 if lhs is "less" than rhs, +1 if "greater", and 0 if equal
// if lhs and rhs have different lengths, only the shorter part will be considered
function compareArrays(lhs, rhs) {
for (var ii = 0; ii < lhs.length; ii++) {
if (lhs[ii] < rhs[ii]) {
return -1;
} else if (lhs[ii] > rhs[ii]) {
return 1;
}
}
return 0;
}
这给了我们想要的东西:
> [ [4,5,10], [4,5,6], [4,1,2] ].sort(compareArrays)
[ [ 4, 1, 2 ],
[ 4, 5, 6 ],
[ 4, 5, 10 ] ]
有什么更像是一个单行,或者我必须在每次想要这样做时定义自己的功能吗?
不要求支持旧浏览器。使用像jQuery或Underscore这样的库是可以的。
一种看待这种情况的方法是&#34;来自标准三向比较的第一个非零值应用于每对元素。&#34;但即便如此,我还没有找到适合现有图书馆的文章。
答案 0 :(得分:1)
可能不是最短的,但我能理解的最少的是:
function compareArrays(lhs, rhs) {
var result;
lhs.some(function(v, i) {
return (result = v - rhs[i]);
});
return result;
}
或不太明智:
function compareArrays(lhs, rhs, r) {
lhs.some(function(v, i) {return (r = v - rhs[i])});
return r;
}
好像你不想要数字。比较部分可以是您想要的任何关系,例如对于字符串:
function compareArrays(lhs, rhs, r) {
lhs.some(function(v, i) {return (r = v < rhs[i]? -1 : v > rhs[i]? 1 : 0)});
return r;
}
[['a','b','c'],['a','c','d'],['a','b','d']].sort(compareArrays) // a,b,c,a,b,d,a,c,d
但比较功能需要知道它的内容,因此它不会将数字排序为字符串或字符串作为数字(依此类推......)。
答案 1 :(得分:1)
我会使用一个通用的比较制造函数来以功能的方式使用:
function compareArrays(compareItems) {
return function(a, b) {
for (var r, i=0, l=Math.min(a.length, b.length); i<l; i++)
if (0 != (r = compareItems(a[i], b[i])))
return r;
return a.length - b.length;
};
}
// Examples:
var compareNumberArrays = compareArray(function(a,b){ return a-b; }),
compareGenericArrays = compareArray(function(a,b){ return +(a>b)||-(b>a); });
现在你可以使用
[ [4,5,10], [4,5,6], [4,1,2], [4,5] ].sort(compareNumberArrays)
有什么更像是一个单行,或者我必须在每次想要这样做时定义自己的功能吗?
比较数组对于单行程序而言过于复杂,您应该使用辅助函数。没有内置的可以在任何地方使用的内容。
答案 2 :(得分:0)
如果你知道它们总是数字的三元组(长度为3的数组),你可以这样做:
function combineNum(array) {
return (array[0] * 100) + (array[1] * 10) + array[2];
}
function compareArrays(lhs, rhs) {
return combineNum(rhs) - combineNum(lhs);
}