【发布时间】:2014-05-27 05:44:12
【问题描述】:
还有其他关于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 之类的库是可以的。
查看此问题的一种方式是“应用到每对元素的标准三向比较中的第一个非零值”。但即便如此,我也没有在现有的库中找到合适的选择。
【问题讨论】:
-
它不会比你的
compareArrays()函数小很多。 -
"使用 jQuery 或 Underscore 之类的库是可以的。" - 那么,把你的函数变成一个库。有你的单线。
-
顺便说一句,您的函数不适用于不同长度的数组。
标签: javascript arrays three-way-merge