gpt4 book ai didi

javascript - Javascript 中数组的三向比较函数

转载 作者:行者123 更新时间:2023-11-30 17:27:44 27 4
gpt4 key购买 nike

还有其他关于 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 等库是可以的。

一种看待这个问题的方法是“应用于每对元素的标准三向比较的第一个非零值”。但即便如此,我也没有找到适合现有库的内容。

最佳答案

我会选择一个通用的比较生成器函数,以功能方式使用:

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)

Is there something more like a one-liner, or must I define my own function whenever I want to do this?

比较数组对于一行代码来说太复杂了,您应该使用辅助函数。没有一种可以随处使用的内置工具。

关于javascript - Javascript 中数组的三向比较函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23881838/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com