Array.sort(compareFn)返回一个数字。 Working Plunker demo返回布尔值?

时间:2018-01-17 18:05:45

标签: javascript typescript

查看此代码:

class Customer {
  id: string;
  name: string;
}

private customers = [
  { id: '1234', name: 'Foo'},
  { id: '3241', name: 'Bar'}
]

getCustomers(): Customer[] {
    return this.customers.sort((a,b) => {
        return a[name] < b[name];
    });
}

你会注意到getCustomers() 返回一个布尔,这是不允许的,因为它被用作期望数字的比较函数

上面的代码会返回错误:Type 'boolean' is not assignable to type 'number'. MDN documentation

中有明确的错误

但是,此代码段:https://plnkr.co/DITVzCSqHHB1uNrTxFit/ 来自Angular教程并且工作正常。 Plunker与其他IDE中使用的打字稿或javascript有什么不同吗? (我使用VSCode和Angular CLI)

2 个答案:

答案 0 :(得分:1)

该错误与Angular无关。您滥用了array.sort() javascript方法。

array.sort()返回一个数组,其中的compareFunction返回number。 比较功能需要以下内容:

1 - a > b
0 - a == b
-1 - a < b

因此,您需要修改代码以使用预期的compareFunction结果:

getCustomers(): Customer[] {
    return this.customers.sort((a,b) => {
        if (a[name] > b[name]) return 1;
        else if (a[name] == b[name] return -1;
        else return 0;
    });
}

详细了解array.sort()&amp;示例:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

答案 1 :(得分:0)

这是因为比较运算符返回 true false 作为值。

您可以通过检查 typeof 操作的结果来轻松测试。

let x = 'a' < 'b';

console.log(typeof x);

你需要一些返回1,0或-1的东西。

String.localeCompare 通常可以解决问题。

const strings = ['a', 'b', 'c']

strings.sort((a, b) => {
    return a.localeCompare(b);
})