这两种数组排序算法是否会为任何输入产生不同的输出
Will these two array sorting algorithms ever produce different output for any inputs?
其中数据是以下格式的元数组,
[
[
"qux doo",
"adsf",
"abcd",
"zzzz",
"898jwe9"
],
[
"abcd",
"xxrwu",
"urnr",
"pupupu",
"sdsdsd"
]
]
对于不同的输入数据值,以下两种算法是否会产生不同的结果?
data.sort(function(a,b){
return (JSON.stringify(a) < JSON.stringify(b)) - (JSON.stringify(a) > JSON.stringify(b));
});
data.sort(function(a, b) {
for (var i = 0; i < Math.min(a.length, b.length); i++) {
if (a[i] < b[i]) return -1;
if (a[i] > b[i]) return 1;
}
return (a.length > b.length) - (a.length < b.length);
});
JSON.stringify()
将转义某些字符(如双引号字符、反斜杠字符或任何控制字符),因此这些字符不太可能正确排序。
此外,由于空格的 ascii 代码低于双引号,因此如果两个数组以 "abcd "
和 "abcd"
开头,它们将无法在 JSON 中正确排序。 "abcd "
应该在 "abcd"
之后,但空格的 ASCII 值低于双引号,因此它将在前面排序。 值末尾的感叹号也是如此。
如果根据您的评论,您还希望这适用于数字等非数组成员,则字符串比较不适用于比较具有不同位数的两个数字,因为1000
不小于 2
,但"1000"
小于 "2"
。
另外,我建议您使用.localeCompare()
来比较第二个算法中的两个字符串,因为它已经具有内置的正、负或零结果。
如果您的所有值都是字符串,或者它们通过 .toString()
正确排序,则可以使用如下.localeCompare()
:
data.sort(function(a, b) {
var comp, i;
for (i = 0; i < Math.min(a.length, b.length); i++) {
if ((comp = a[i].localeCompare(b[i])) !== 0) return comp;
}
return (a.length > b.length) - (a.length < b.length);
});
.localeCompare
还提供了可用于区分大小写、忽略标点符号、如何处理重音字符等的选项。
根据您的评论和每个 MDN,您可以在与 Collator 对象(仅在某些浏览器中可用)进行比较时获得更好的性能。 根据文档(我自己只尝试过一次这段代码),它的工作原理是这样的:
var collater = new Intl.Collator();
data.sort(function(a, b) {
var comp, i;
for (i = 0; i < Math.min(a.length, b.length); i++) {
if ((comp = collater.compare(a[i], b[i])) !== 0) return comp;
}
return (a.length > b.length) - (a.length < b.length);
});
大概必须有一些初始化或开销,可以只以这种方式完成一次。 也许他们构建了直接查找排序表。
但是浏览器对 Collator 对象的支持很少(IE 11、Chrome、没有 Firefox、没有 Safari),所以除非你在浏览器插件中使用它,所以代码只特定于一个浏览器,你必须分支它是否受支持并有两个实现。
附言如果您有大量外部数组元素,因此多次调用排序回调,它将执行得非常糟糕。 您至少可以做到每次只执行两个JSON.stringify()
调用,而不是四个。
- 使用JS从选择和文本输入中捕获值,并将输出返回到HTML
- 从表单中获取用户输入执行计算(操作顺序)并输出回该表单
- 如何使用Javascript使用给定的输入创建输出表
- 输入到输出不会改变结果中的单词
- 节点.js加密输入/输出类型
- 想要从输入字段中输出确切的值
- 在javascript中测量websockets数据输入/输出的大小
- 整数 + 2x 单选按钮设置输入 --> 输出
- 我有一个mysql的输入文本字段.那么,如何通过ajax从数据库中输出json表呢
- 从输入中读取并将其内容作为输出进行管道传输
- 如何通过JavaScript将二进制(输入)转换为字符串(输出)
- 如何将文本输出到不是't输入不同颜色的文本
- 用于提示输入和输出的JavaScript按字母顺序排序
- 输出输入的字符串10次JavaScript
- 用户在数字上输入金额,然后输出最高数字javascript
- 接收输入数字,直到用户输入零.然后输出最高.JavaScript
- 修改输入中的数组,然后返回输出
- 如何添加单选按钮和复选框将选择输入到一起以形成JavaScript输出
- 这两种数组排序算法是否会为任何输入产生不同的输出
- 输入文本,带假路径,输出输入文本