JavaScript比较字符串

原文:Compare Strings in JavaScript

JavaScript的比较运算符很容易比较字符串,另外还有localeCompare()可以用于排序。

JavaScript中,两个字符串相等代表什么?一个字符串大于另一个又代表什么?

JavaScript的三等运算符===,在两个字符串完全相同时返回true,否则返回false

1
2
'hello' === 'hello'; // true
'Hello' === 'hello'; // false

<>运算符按词法顺序比较字符串。词法顺序基本上等同于“字典顺序”。简单的说,如果按ASCII表顺序,a的第一个字符在b的第一个字符之前,那么a < b;如果ab的第一个字符相等,而a.slice(1) < b.slice(1),那么也是a < b

1
2
3
4
5
6
'alpha' < 'zeta'; // true, 因为'a'在'z'之前
'alpha' < 'Zeta'; // false, 因为ASCII表中 'Z' = 90, 'a' = 97
'one' < '1'; // false, 因为ASCII表中 '1' = 49, 'o' = 111

'octo' < 'okto'; // true, 因为 'c' = 99, 'k' = 107
'a' < 'alpha'; // true, 因为ASCII表中字符串终止符 = '0'

字符串数组排序

JavaScript的Array#sort()函数按词法顺序自动排序。

1
['Zeta', '1', 'alpha', ''].sort(); // ['', '1', 'Zeta', 'alpha']

lodash的sortBy()函数对字符串数组也默认按词法顺序排序。

1
_.sortBy(['Zeta', '1', 'alpha', '']); // ['', '1', 'Zeta', 'alpha']

一个对象数组,如何按字符串属性排序Array#sort()接收一个回调函数作为参数,回调接收2个值ab,返回值如下:

  • 0 如果a和b相等
  • 正数 如果a > b
  • 负数 如果a < b

给定一个对象数组,对象中包含lastName属性,以下是按lastName对数组排序的一种方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const characters = [
{ firstName: 'Jean-Luc', lastName: 'Picard', rank: 'Captain', age: 59 },
{ firstName: 'Will', lastName: 'Riker', rank: 'Commander', age: 29 },
{ firstName: 'Geordi', lastName: 'La Forge', rank: 'Lieutenant', age: 29 }
];

characters.sort((a, b) => {
if (a === b) {
return 0;
}
return a.lastName < b.lastName ? -1 : 1;
});

// La Forge, Picard, Riker
characters;

更简单的方法是使用JavaScript内置的localeCompare()函数。调用a.localeCompare(b),如果a < b,返回-1,如果a === b,返回0,如果a > b,返回1

1
2
3
4
5
6
7
8
9
10
const characters = [
{ firstName: 'Jean-Luc', lastName: 'Picard', rank: 'Captain', age: 59 },
{ firstName: 'Will', lastName: 'Riker', rank: 'Commander', age: 29 },
{ firstName: 'Geordi', lastName: 'La Forge', rank: 'Lieutenant', age: 29 }
];

characters.sort((a, b) => a.lastName.localeCompare(b.lastName));

// La Forge, Picard, Riker
characters;