我在https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort?v=example处遵循了有关sort
的文档。它不起作用。我甚至遇到了一个棘手的问题:几个小时之后,我发现如果我将var comparator
更改为function comparator(a,b)
,它就可以了。为什么???
test();
var comparator = (a, b) => {
if (a.min !== b.min) {
if (a.min < b.min) {
return -1
} else {
return +1
}
} else {
if (a.max !== b.max) {
if (a.max < b.max) {
return -1
} else {
return +1
}
} else {
return 0;
}
}
}
function test() {
for (var x = 0; x < 1; x++) {
var tests = [{min: 18, max: 20},
{min: 17, max: 20},
{min: 10, max: 11}];
console.log(tests.sort(comparator), 'test sorted');
}
}
答案 0 :(得分:2)
如果您将函数test
的调用放在最后,它将起作用。这与JavaScript中的 hoisting 相关。
var comparator = (a, b) => {
if (a.min !== b.min) {
if (a.min < b.min) {
return -1
} else {
return +1
}
} else {
if (a.max !== b.max) {
if (a.max < b.max) {
return -1
} else {
return +1
}
} else {
return 0;
}
}
}
function test() {
for (var x = 0; x < 1; x++) {
var tests = [{min: 18, max: 20},
{min: 17, max: 20},
{min: 10, max: 11}];
console.log(tests.sort(comparator), 'test sorted');
}
}
test();
&#13;
<强>更新强>
正如charlietfl在他的评论中指出的,由于提升你的脚本也会有效,如果你在test
声明之后立即调用comparator
函数。
var comparator = (a, b) => {
if (a.min !== b.min) {
if (a.min < b.min) {
return -1
} else {
return +1
}
} else {
if (a.max !== b.max) {
if (a.max < b.max) {
return -1
} else {
return +1
}
} else {
return 0;
}
}
}
test();
function test() {
for (var x = 0; x < 1; x++) {
var tests = [{min: 18, max: 20},
{min: 17, max: 20},
{min: 10, max: 11}];
console.log(tests.sort(comparator), 'test sorted');
}
}
&#13;
答案 1 :(得分:1)
这是因为hoisting变量问题。您正在尝试在定义函数表达式之前调用它。运行时,comparator
为undefined
。