Baseline Widely available
sort()
æ¹æ³å°±å°å¯¹æ°ç»çå
ç´ è¿è¡æåºï¼å¹¶è¿å对ç¸åæ°ç»çå¼ç¨ãé»è®¤æåºæ¯å°å
ç´ è½¬æ¢ä¸ºå符串ï¼ç¶åæç
§å®ä»¬ç UTF-16 ç å
å¼ååºæåºã
ç±äºå®åå³äºå ·ä½å®ç°ï¼å æ¤æ æ³ä¿è¯æåºçæ¶é´å空é´å¤æåº¦ã
妿æ³è¦ä¸æ¹ååæ°ç»çæåºæ¹æ³ï¼å¯ä»¥ä½¿ç¨ toSorted()
ã
const months = ["March", "Jan", "Feb", "Dec"];
months.sort();
console.log(months);
// Expected output: Array ["Dec", "Feb", "Jan", "March"]
const array1 = [1, 30, 4, 21, 100000];
array1.sort();
console.log(array1);
// Expected output: Array [1, 100000, 21, 30, 4]
è¯æ³ åæ°
compareFn
å¯é
å®ä¹æåºé¡ºåºç彿°ãè¿åå¼åºè¯¥æ¯ä¸ä¸ªæ°åï¼å
¶ç¬¦å·è¡¨ç¤ºä¸¤ä¸ªå
ç´ çç¸å¯¹é¡ºåºï¼å¦æ a
å°äº b
ï¼è¿åå¼ä¸ºè´æ°ï¼å¦æ a
å¤§äº b
ï¼è¿åå¼ä¸ºæ£æ°ï¼å¦æä¸¤ä¸ªå
ç´ ç¸çï¼è¿åå¼ä¸º 0
ãNaN
被è§ä¸º 0
ãè¯¥å½æ°ä½¿ç¨ä»¥ä¸åæ°è°ç¨ï¼
a
第ä¸ä¸ªç¨äºæ¯è¾çå
ç´ ãä¸ä¼æ¯ undefined
ã
b
第äºä¸ªç¨äºæ¯è¾çå
ç´ ãä¸ä¼æ¯ undefined
ã
妿çç¥è¯¥å½æ°ï¼æ°ç»å ç´ ä¼è¢«è½¬æ¢ä¸ºå符串ï¼ç¶åæ ¹æ®æ¯ä¸ªå符ç Unicode ç ä½å¼è¿è¡æåºã
ç»è¿æåºçåå§æ°ç»çå¼ç¨ãæ³¨ææ°ç»æ¯å°±å°æåºçï¼ä¸ä¼è¿è¡å¤å¶ã
æè¿°å¦ææ²¡ææä¾ compareFn
ï¼ææé undefined
çæ°ç»å
ç´ é½ä¼è¢«è½¬æ¢ä¸ºå符串ï¼å¹¶æç
§ UTF-16 ç å
é¡ºåºæ¯è¾å符串è¿è¡æåºãä¾å¦âbananaâä¼è¢«æåå°âcherryâä¹åã卿°å¼æåºä¸ï¼9 åºç°å¨ 80 ä¹åï¼ä½å 为æ°åä¼è¢«è½¬æ¢ä¸ºå符串ï¼å¨ Unicode 顺åºä¸â80âæå¨â9âä¹åãææç undefined
å
ç´ é½ä¼è¢«æåºå°æ°ç»çæ«å°¾ã
sort()
æ¹æ³ä¿ç空槽ãå¦ææºæ°ç»æ¯ç¨ççï¼å空槽ä¼è¢«ç§»å¨å°æ°ç»çæ«å°¾ï¼å¹¶å§ç»æå¨ææ undefined
å
ç´ çåé¢ã
夿³¨ï¼ å¨ UTF-16 ä¸ï¼Unicode å符è¶
åº \uFFFF
çèå´ä¼è¢«ç¼ç 为两个代çç å
ï¼surrogate code unitï¼ï¼è¿äºç ä½çèå´æ¯ \uD800
å° \uDFFF
ãæ¯ä¸ªç ä½çå¼é½ä¼è¢«åç¬èèè¿è¡æ¯è¾ãå æ¤ï¼ç±ä»£ç对 \uD855\uDE51
ç»æçåç¬¦å°æå¨å符 \uFF3A
çåé¢ã
妿æä¾äº compareFn
ï¼ææé undefined
çæ°ç»å
ç´ é½ä¼æç
§æ¯è¾å½æ°çè¿åå¼è¿è¡æåºï¼ææç undefined
å
ç´ é½ä¼è¢«æåºå°æ°ç»çæ«å°¾ï¼å¹¶ä¸ä¸è°ç¨ compareFn
ï¼ã
compareFn(a, b)
è¿åå¼ æåºé¡ºåº > 0 a
å¨ b
åï¼å¦ [b, a]
< 0 a
å¨ b
åï¼å¦ [a, b]
=== 0 ä¿æ a
å b
忥ç顺åº
æä»¥ï¼æ¯è¾å½æ°å½¢å¼å¦ä¸ï¼
function compareFn(a, b) {
if (æ ¹æ®æåºæ åï¼a å°äº b) {
return -1;
}
if (æ ¹æ®æåºæ åï¼a å¤§äº b) {
return 1;
}
// a ä¸å®çäº b
return 0;
}
æ´æ£å¼å°è¯´ï¼ä¸ºäºç¡®ä¿æ£ç¡®çæåºè¡ä¸ºï¼æ¯è¾å½æ°åºå ·æä»¥ä¸å±æ§ï¼
compareFn(a, a) === 0
ãcompareFn(a, b)
å compareFn(b, a)
å¿
须齿¯ 0
æè
å
·æç¸åç符å·ãcompareFn(a, b)
å compareFn(b, c)
齿¯æ£æ°ãé¶æè´æ°ï¼å compareFn(a, c)
ç符å·ä¸åé¢ä¸¤ä¸ªç¸åã符åä¸è¿°éå¶çæ¯è¾å½æ°å°å§ç»è½å¤è¿å 1
ã0
å -1
ä¸çä»»æä¸ä¸ªï¼æè
å§ç»è¿å 0
ãä¾å¦ï¼å¦ææ¯è¾å½æ°åªè¿å 1
å 0
ï¼æè
åªè¿å 0
å -1
ï¼å®å°æ æ³å¯é å°æåºï¼å 为å对称æ§è¢«ç ´åäºãä¸ä¸ªæ»æ¯è¿å 0
çæ¯è¾å½æ°å°ä¸ä¼æ¹åæ°ç»ï¼ä½ä»ç¶æ¯å¯é çã
é»è®¤çåå ¸æ¯è¾å½æ°ç¬¦åä¸è¿°ææéå¶ã
è¦æ¯è¾æ°åèéåç¬¦ä¸²ï¼æ¯è¾å½æ°å¯ä»¥ç®åçç¨ a
å b
ï¼å¦ä¸ç彿°å°ä¼å°æ°ç»ååºæåï¼å¦æå®ä¸å
å« Infinity
å NaN
ï¼ï¼
function compareNumbers(a, b) {
return a - b;
}
sort()
æ¹æ³æ¯éç¨çï¼å®åªææ this
å¼å
·æ length
屿§åæ´æ°é®å±æ§ãè½ç¶å符串ä¹ç±»ä¼¼äºæ°ç»ï¼ä½æ¤æ¹æ³ä¸éç¨äºå符串ï¼å 为å符串æ¯ä¸å¯åçã
ä¸è¿°ç¤ºä¾å建äºå个æ°ç»ï¼å¹¶å±ç¤ºåæ°ç»ãä¹å对æ°ç»è¿è¡æåºã对æ¯äºæ°åæ°ç»å嫿å®ä¸ä¸æå®æ¯è¾å½æ°çç»æã
const stringArray = ["Blue", "Humpback", "Beluga"];
const numberArray = [40, 1, 5, 200];
const numericStringArray = ["80", "9", "700"];
const mixedNumericArray = ["80", "9", "700", 40, 1, 5, 200];
function compareNumbers(a, b) {
return a - b;
}
stringArray.join(); // 'Blue,Humpback,Beluga'
stringArray.sort(); // ['Beluga', 'Blue', 'Humpback']
numberArray.join(); // '40,1,5,200'
numberArray.sort(); // [1, 200, 40, 5]
numberArray.sort(compareNumbers); // [1, 5, 40, 200]
numericStringArray.join(); // '80,9,700'
numericStringArray.sort(); // ['700', '80', '9']
numericStringArray.sort(compareNumbers); // ['9', '80', '700']
mixedNumericArray.join(); // '80,9,700,40,1,5,200'
mixedNumericArray.sort(); // [1, 200, 40, 5, '700', '80', '9']
mixedNumericArray.sort(compareNumbers); // [1, 5, '9', 40, '80', 200, '700']
对象æ°ç»çæåº
对象æ°ç»å¯ä»¥éè¿æ¯è¾å®ä»¬çæä¸ªå±æ§ç弿¥æåºã
const items = [
{ name: "Edward", value: 21 },
{ name: "Sharpe", value: 37 },
{ name: "And", value: 45 },
{ name: "The", value: -12 },
{ name: "Magnetic", value: 13 },
{ name: "Zeros", value: 37 },
];
// æ ¹æ® value æåº
items.sort((a, b) => a.value - b.value);
// æ ¹æ® name æåº
items.sort((a, b) => {
const nameA = a.name.toUpperCase(); // 忽ç¥å¤§å°å
const nameB = b.name.toUpperCase(); // 忽ç¥å¤§å°å
if (nameA < nameB) {
return -1;
}
if (nameA > nameB) {
return 1;
}
// name å¿
é¡»ç¸ç
return 0;
});
对é ASCII å符æåº
彿åºé ASCII å符çå符串ï¼å¦å
å«ç±»ä¼¼ eãéãèãaãä çå符çå符串ï¼ãä¸äºéè±è¯è¯è¨çå符串éè¦ä½¿ç¨ String.localeCompare
ãè¿ä¸ªå½æ°å¯ä»¥å°å½æ°æåºå°æ£ç¡®ç顺åºã
var items = ["réservé", "premier", "cliché", "communiqué", "café", "adieu"];
items.sort(function (a, b) {
return a.localeCompare(b);
});
// items æ¯ ['adieu', 'café', 'cliché', 'communiqué', 'premier', 'réservé']
ä½¿ç¨ map æ¹åæåº
compareFn
å¯è½ä¼å¨æ°ç»ä¸çæ¯ä¸ªå
ç´ ä¸è°ç¨å¤æ¬¡ãæ ¹æ® compareFn
çæ§è´¨ï¼è¿å¯è½ä¼äº§çå¾é«çå¼éã妿 compareFn
æ§è¡ç工使´å¤ï¼éè¦æåºçå
ç´ æ´å¤ï¼ä½¿ç¨ map()
è¿è¡æåºå¯è½æ´ææçãå
¶æè·¯æ¯éåæ°ç»ä¸æ¬¡ï¼å°ç¨äºæåºçå®é
弿åå°ä¸ä¸ªä¸´æ¶æ°ç»ä¸ï¼å¯¹ä¸´æ¶æ°ç»è¿è¡æåºï¼ç¶åéåä¸´æ¶æ°ç»ä»¥è·å¾æ£ç¡®ç顺åºã
// éè¦è¢«æåºçæ°ç»
const data = ["delta", "alpha", "charlie", "bravo"];
// ç¨äºåæ¾ä½ç½®åæåºå¼ç对象æ°ç»
const mapped = data.map((v, i) => {
return { i, value: someSlowOperation(v) };
});
// æç
§å¤ä¸ªå¼æåºæ°ç»
mapped.sort((a, b) => {
if (a.value > b.value) {
return 1;
}
if (a.value < b.value) {
return -1;
}
return 0;
});
const result = mapped.map((v) => data[v.i]);
æä¸ä¸ªå¼æºåºå«å mapsortï¼å®éç¨äºè¿ç§æ¹æ³ã
sort() æ¹æ³è¿å对å䏿°ç»çå¼ç¨sort()
æ¹æ³è¿å对åå§æ°ç»çå¼ç¨ï¼å æ¤æ´æ¹è¿åçæ°ç»å°åæ¶æ´æ¹åå§æ°ç»ã
const numbers = [3, 1, 4, 1, 5];
const sorted = numbers.sort((a, b) => a - b);
// numbers å sorted 齿¯ [1, 1, 3, 4, 5]
sorted[0] = 10;
console.log(numbers[0]); // 10
å¦æä½ å¸æ sort()
æ¹æ³ä¸ä¼æ¹ååå§æ°ç»ï¼èæ¯è¿åä¸ä¸ªç±»ä¼¼äºå
¶ä»æ°ç»æ¹æ³ï¼å¦ map()
ï¼è¿åçæµ
æ·è´æ°ç»ï¼å¯ä»¥ä½¿ç¨ toSorted()
æ¹æ³ãæè
ï¼ä½ å¯ä»¥å¨è°ç¨ sort()
ä¹å使ç¨å±å¼è¯æ³æ Array.from()
è¿è¡æµ
æ·è´ã
const numbers = [3, 1, 4, 1, 5];
// [...numbers] å建ä¸ä¸ªæµ
æ·è´ï¼å æ¤ sort() ä¸ä¼æ¹ååå§æ°ç»ã
const sorted = [...numbers].sort((a, b) => a - b);
sorted[0] = 10;
console.log(numbers[0]); // 3
æåºç¨³å®æ§
èª EcmaScript 第 10 çï¼EcmaScript 2019ï¼èµ·ï¼è§è è¦æ± Array.prototype.sort
ä¸ºç¨³å®æåºã
å设æä¸ä¸ªå å«å¦çååå年级çå表ï¼å·²ç»å°å®æå¦çåååæ¯é¡ºåºè¿è¡é¢æåºï¼
const students = [
{ name: "Alex", grade: 15 },
{ name: "Devlin", grade: 15 },
{ name: "Eagle", grade: 13 },
{ name: "Sam", grade: 14 },
];
对è¿ä¸ªæ°ç»æ§è¡ grade
ååºæåºåï¼
students.sort((firstItem, secondItem) => firstItem.grade - secondItem.grade);
students
åéä¼å
·æä»¥ä¸å¼ï¼
[
{ name: "Eagle", grade: 13 },
{ name: "Sam", grade: 14 },
{ name: "Alex", grade: 15 }, // grade ç¸åæ¶ç»´æåå
ç顺åºï¼ç¨³å®æåºï¼
{ name: "Devlin", grade: 15 }, // grade ç¸åæ¶ç»´æåå
ç顺åºï¼ç¨³å®æåºï¼
];
注æï¼é£äºå¹´çº§ç¸åçå¦çï¼å¦ Alex å Devlinï¼ä¼ç»´æè°ç¨æåºä¹åç顺åºï¼è¿æ¯ç¨³å®æåºæç¡®ä¿çã
EcmaScript 第 10 çï¼EcmaScript 2019ï¼ä»¥å没æè¦æ±ç¨³å®æ§ï¼æå³çä½ å¯è½ä¼å¾å°ä»¥ä¸ç»æï¼
[
{ name: "Eagle", grade: 13 },
{ name: "Sam", grade: 14 },
{ name: "Devlin", grade: 15 }, // 没æç»´æåå
ç顺åº
{ name: "Alex", grade: 15 }, // 没æç»´æåå
ç顺åº
];
使ç¨éè§èçæ¯è¾å½æ°è¿è¡æåº
妿ä¸ä¸ªæ¯è¾å½æ°ä¸ç¬¦åçº¯å½æ°ãç¨³å®æ§ãèªåæ§ãå对称æ§åä¼ éæ§è§åï¼å°±åå¨æè¿°ä¸è§£éç飿 ·ï¼ç¨åºçè¡ä¸ºæ¯æªå®ä¹çã
ä¾å¦ï¼è¯·çè¿ä¸ªç¤ºä¾ï¼
const arr = [3, 1, 4, 1, 5, 9];
const compareFn = (a, b) => (a > b ? 1 : 0);
arr.sort(compareFn);
å¨è¿ä¸ªä¾åä¸ï¼compareFn
彿°æ¯ä¸è§èçï¼å 为å®ä¸æ»¡è¶³å对称æ§ï¼å¦æ a > b
ï¼å®è¿å 1
ï¼ä½æ¯éè¿äº¤æ¢ a
å b
ï¼å®è¿åäº 0
è䏿¯ä¸ä¸ªè´å¼ãå æ¤ï¼å¯¹äºä¸åç弿ï¼ç»ææ°ç»ä¹ä¼ææä¸åãä¾å¦ï¼V8ï¼ç¨äº ChromeãNode.js çï¼å JavaScriptCoreï¼ç¨äº Safariï¼æ ¹æ¬ä¸ä¼å¯¹æ°ç»è¿è¡æåºï¼èæ¯è¿å [3, 1, 4, 1, 5, 9]
ï¼è SpiderMonkeyï¼ç¨äº Firefoxï¼å°è¿åååºæåºçæ°ç» [1, 1, 3, 4, 5, 9]
ã
ç¶èï¼å¦æ compareFn
彿°ç¨å¾®æ¹åä¸ä¸ï¼ä½¿å
¶è¿å -1
æ 0
ï¼
const arr = [3, 1, 4, 1, 5, 9];
const compareFn = (a, b) => (a > b ? -1 : 0);
arr.sort(compareFn);
é£ä¹å¨ V8 å JavaScriptCore ä¸ï¼å®å°æéåºæåºï¼ç»æä¸º [9, 5, 4, 3, 1, 1]
ï¼è SpiderMonkey è¿åçç»ææ¯åå§æ°ç»ï¼[3, 1, 4, 1, 5, 9]
ã
ç±äºè¿ç§å®ç°çä¸ä¸è´æ§ï¼å»ºè®®å§ç»éµå¾ªäºä¸ªçº¦ææ¡ä»¶ä»¥ç¡®ä¿ä½ çæ¯è¾å½æ°æ¯è§èçã
å¨ç¨çæ°ç»ä¸ä½¿ç¨ sort()空槽ä¼è¢«ç§»å¨å°æ°ç»çæ«å°¾ã
console.log(["a", "c", , "b"].sort()); // ['a', 'b', 'c', empty]
console.log([, undefined, "a", "b"].sort()); // ["a", "b", undefined, empty]
å¨ç±»æ°ç»å¯¹è±¡ä¸è°ç¨ sort()
sort()
æ¹æ³ä¼è¯»å this
ç length
屿§ãç¶åå®ä¼æ¶éå¨ 0
å° length - 1
èå´å
ææå·²åå¨çæ´æ°é®å±æ§ï¼å¯¹å®ä»¬è¿è¡æåºï¼ç¶åååã妿èå´å
åå¨ç¼ºå¤±ç屿§ï¼åç¸åºçå°¾é屿§å°è¢«å é¤ï¼å¥½åä¸åå¨ç屿§è¢«æåºå°æ«å°¾ä¸æ ·ã
const arrayLike = {
length: 3,
unrelated: "foo",
0: 5,
2: 4,
};
console.log(Array.prototype.sort.call(arrayLike));
// { '0': 4, '1': 5, length: 3, unrelated: 'foo' }
è§è æµè§å¨å
¼å®¹æ§ åè§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4