按属性排序对象不起作用

时间:2017-04-22 12:40:21

标签: javascript node.js sorting

我在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');
    }

}

2 个答案:

答案 0 :(得分:2)

如果您将函数test的调用放在最后,它将起作用。这与JavaScript中的 hoisting 相关。

&#13;
&#13;
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;
&#13;
&#13;

<强>更新

正如charlietfl在他的评论中指出的,由于提升你的脚本也会有效,如果你在test声明之后立即调用comparator函数。

&#13;
&#13;
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;
&#13;
&#13;

答案 1 :(得分:1)

这是因为hoisting变量问题。您正在尝试在定义函数表达式之前调用它。运行时,comparatorundefined