Baseline Widely available
reduce()
æ¹æ³å¯¹æ°ç»ä¸çæ¯ä¸ªå
ç´ æåºæ§è¡ä¸ä¸ªæä¾ç reducer 彿°ï¼æ¯ä¸æ¬¡è¿è¡ reducer ä¼å°å
åå
ç´ ç计ç®ç»æä½ä¸ºåæ°ä¼ å
¥ï¼æåå°å
¶ç»ææ±æ»ä¸ºå个è¿åå¼ã
ç¬¬ä¸æ¬¡æ§è¡åè°å½æ°æ¶ï¼ä¸åå¨âä¸ä¸æ¬¡ç计ç®ç»æâã妿éè¦åè°å½æ°ä»æ°ç»ç´¢å¼ä¸º 0 çå ç´ å¼å§æ§è¡ï¼åéè¦ä¼ éåå§å¼ãå¦åï¼æ°ç»ç´¢å¼ä¸º 0 çå ç´ å°è¢«ç¨ä½åå§å¼ï¼è¿ä»£å¨å°ä»ç¬¬äºä¸ªå ç´ å¼å§æ§è¡ï¼å³ä»ç´¢å¼ä¸º 1 è䏿¯ 0 çä½ç½®å¼å§ï¼ã
ä¸é¢çä¾åè½å¤å¸®å©ä½ çè§£ reduce()
çç¨å¤ââè®¡ç®æ°ç»ææå
ç´ çæ»åï¼
const array1 = [1, 2, 3, 4];
// 0 + 1 + 2 + 3 + 4
const initialValue = 0;
const sumWithInitial = array1.reduce(
(accumulator, currentValue) => accumulator + currentValue,
initialValue,
);
console.log(sumWithInitial);
// Expected output: 10
reducer é个éåæ°ç»å ç´ ï¼æ¯ä¸æ¥é½å°å½åå ç´ çå¼ä¸å䏿¥çç»æç¸å ï¼è¯¥ç»ææ¯ä¹åæææ¥éª¤ç»æçæ»åï¼ââç´å°æ²¡ææ´å¤éè¦ç¸å çå ç´ ã
è¯æ³reduce(callbackFn)
reduce(callbackFn, initialValue)
åæ°
callbackFn
为æ°ç»ä¸æ¯ä¸ªå
ç´ æ§è¡ç彿°ãå
¶è¿åå¼å°ä½ä¸ºä¸ä¸æ¬¡è°ç¨ callbackFn
æ¶ç accumulator
åæ°ãå¯¹äºæå䏿¬¡è°ç¨ï¼è¿åå¼å°ä½ä¸º reduce()
çè¿åå¼ãè¯¥å½æ°è¢«è°ç¨æ¶å°ä¼ å
¥ä»¥ä¸åæ°ï¼
accumulator
ä¸ä¸æ¬¡è°ç¨ callbackFn
çç»æãå¨ç¬¬ä¸æ¬¡è°ç¨æ¶ï¼å¦ææå®äº initialValue
å为æå®çå¼ï¼å¦å为 array[0]
çå¼ã
currentValue
å½åå
ç´ çå¼ãå¨ç¬¬ä¸æ¬¡è°ç¨æ¶ï¼å¦ææå®äº initialValue
ï¼å为 array[0]
çå¼ï¼å¦å为 array[1]
ã
currentIndex
currentValue
卿°ç»ä¸çç´¢å¼ä½ç½®ãå¨ç¬¬ä¸æ¬¡è°ç¨æ¶ï¼å¦ææå®äº initialValue
å为 0
ï¼å¦å为 1
ã
array
è°ç¨äº reduce()
çæ°ç»æ¬èº«ã
initialValue
å¯é
ç¬¬ä¸æ¬¡è°ç¨åè°æ¶åå§å accumulator
çå¼ã妿æå®äº initialValue
ï¼å callbackFn
仿°ç»ä¸ç第ä¸ä¸ªå¼ä½ä¸º currentValue
å¼å§æ§è¡ãå¦ææ²¡ææå® initialValue
ï¼å accumulator
åå§å为æ°ç»ä¸ç第ä¸ä¸ªå¼ï¼å¹¶ä¸ callbackFn
仿°ç»ä¸ç第äºä¸ªå¼ä½ä¸º currentValue
å¼å§æ§è¡ãå¨è¿ç§æ
åµä¸ï¼å¦ææ°ç»ä¸ºç©ºï¼æ²¡æç¬¬ä¸ä¸ªå¼å¯ä»¥ä½ä¸º accumulator
è¿åï¼ï¼å伿åºé误ã
使ç¨âreducerâåè°å½æ°éåæ´ä¸ªæ°ç»åçç»æã
å¼å¸¸TypeError
妿æ°ç»ä¸ºç©ºä¸æªæä¾ initialValue
ï¼å伿åºå¼å¸¸ã
reduce()
æ¹æ³æ¯ä¸ä¸ªè¿ä»£æ¹æ³ã宿ååºå¯¹æ°ç»ä¸çææå
ç´ è¿è¡ä¸ä¸ªâreducerâåè°å½æ°ï¼å¹¶å°å®ä»¬ç´¯ç§¯å°ä¸ä¸ªåä¸çå¼ä¸ãæ¯æ¬¡è°ç¨æ¶ï¼callbackFn
çè¿åå¼é½ä½ä¸º accumulator
åæ°ä¼ éå°ä¸ä¸æ¬¡è°ç¨ä¸ãaccumulator
çæç»å¼ï¼ä¹å°±æ¯å¨æ°ç»çæå䏿¬¡è¿ä»£ä¸ä» callbackFn
è¿åçå¼ï¼å°ä½ä¸º reduce()
çè¿åå¼ã
callbackFn
ä»
对已åé
å¼çæ°ç»ç´¢å¼è¿è¡è°ç¨ãä¸ä¼å¯¹ç¨çæ°ç»ä¸ç空槽è¿è¡è°ç¨ã
ä¸å
¶ä»è¿ä»£æ¹æ³ä¸åï¼reduce()
䏿¥å thisArg
åæ°ãcallbackFn
è°ç¨æ¶å§ç»ä»¥ undefined
ä½ä¸º this
çå¼ï¼å¦æ callbackFn
æªå¤äºä¸¥æ ¼æ¨¡å¼ï¼å该å¼å°è¢«æ¿æ¢ä¸º globalThis
ã
reduce()
æ¯å½æ°å¼ç¼ç¨ä¸çä¸ä¸ªæ ¸å¿æ¦å¿µï¼å¨å½æ°å¼ç¼ç¨ä¸ï¼ä¸å¯è½æ¹åä»»ä½å¼ï¼å æ¤ä¸ºäºç´¯ç§¯æ°ç»ä¸çææå¼ï¼å¿
须卿¯æ¬¡è¿ä»£ä¸è¿åä¸ä¸ªæ°çç´¯å å¨ãè¿ç§çº¦å®ä¹éç¨äº JavaScript ç reduce()
ï¼åºè¯¥å¨å¯è½çæ
åµä¸ä½¿ç¨å±å¼è¯æ³æå
¶ä»å¤å¶æ¹æ³æ¥å建æ°çæ°ç»å对象ä½ä¸ºç´¯å å¨ï¼è䏿¯æ¹åç°æçç´¯å å¨ãå¦æä½ å³å®æ¹åç´¯å å¨è䏿¯å¤å¶å®ï¼è¯·è®°å¾ä»ç¶å¨åè°ä¸è¿åä¿®æ¹åç对象ï¼å¦åä¸ä¸æ¬¡è¿ä»£å°æ¶å° undefined
ã
reduce()
ä¸ä¼æ¹å被è°ç¨çæ°ç»ï¼ä½æ¯ä½ä¸º callbackFn
æä¾ç彿°å¯è½ä¼æ¹åæ°ç»ãä½éè¦æ³¨æçæ¯ï¼å¨ç¬¬ä¸æ¬¡è°ç¨ callbackFn
ä¹åï¼æ°ç»çé¿åº¦ä¼è¢«ä¿åãå æ¤ï¼
reduce()
æ¶ï¼callbackFn
å°ä¸ä¼è®¿é®è¶
åºæ°ç»åå§é¿åº¦çä»»ä½å
ç´ ãcallbackFn
ãcallbackFn
æ´æ¹ï¼åå®ä¼ éç» callbackFn
çå¼å°æ¯è¯¥å
ç´ è¢«ä¿®æ¹åçå¼ã被å é¤çå
ç´ åä¸ä¼è¢«è®¿é®ãè¦åï¼ ä¸è¿°ç±»åçå¹¶åä¿®æ¹ç»å¸¸å¯¼è´é¾ä»¥çè§£ç代ç ï¼é常åºé¿å ï¼ç¹æ®æ åµé¤å¤ï¼ã
reduce()
æ¹æ³æ¯éç¨çãå®åªææ this
å¼å
·æ length
屿§åæ´æ°é®å±æ§ã
å reduce()
è¿æ ·çéå½å½æ°å¯è½é常强大ï¼ä½ææ¶å¯è½å¾é¾çè§£ï¼ç¹å«æ¯å¯¹äºç¼ºä¹ç»éªç JavaScript å¼å人åãå¦æä½¿ç¨å
¶ä»æ°ç»æ¹æ³å¯ä»¥ä½¿ä»£ç æ´æ¸
æ°ï¼åå¼å人åå¿
é¡»æè¡¡ä»£ç å¯è¯»æ§ä¸ä½¿ç¨ reduce()
带æ¥ç好å¤ã妿 reduce()
ç¡®å®æ¯æä½³éæ©ï¼åºè¯¥éè¿è¯å¥½çææ¡£åè¯ä¹åçåéå½åæ¥æé«ä»£ç çå¯è¯»æ§ã
妿æ°ç»åªæä¸ä¸ªå
ç´ ï¼æ 论ä½ç½®å¦ä½ï¼ä¸æªæä¾ initialValue
ï¼æè
æä¾äº initialValue
使°ç»ä¸ºç©ºï¼åå°è¿å该å个å¼ï¼èä¸è°ç¨ callbackFn
ã
妿æä¾äº initialValue
䏿°ç»ä¸ä¸ºç©ºï¼å reduce
æ¹æ³å°å§ç»ä»ç´¢å¼ 0 å¼å§è°ç¨åè°å½æ°ã
å¦ææªæä¾ initialValue
ï¼å对äºé¿åº¦å¤§äº 1ãçäº 1 å 0 çæ°ç»ï¼reduce
æ¹æ³å°æä¸åç表ç°ï¼å¦ä»¥ä¸ç¤ºä¾æç¤ºï¼
const getMax = (a, b) => Math.max(a, b);
// ä»ç´¢å¼ 0 å¼å§ä¸ºæ°ç»ä¸çæ¯ä¸ªå
ç´ è°ç¨åè°å½æ°
[1, 100].reduce(getMax, 50); // 100
[50].reduce(getMax, 10); // 50
// ä»
ä¸ºç´¢å¼ 1 å¤çå
ç´ è°ç¨åè°å½æ°
[1, 100].reduce(getMax); // 100
// ä¸è°ç¨åè°å½æ°
[50].reduce(getMax); // 50
[].reduce(getMax, 1); // 1
[].reduce(getMax); // TypeError
ç¤ºä¾ æ åå§å¼æ¶ reduce() å¦ä½è¿è¡
åå¦è¿è¡ä»¥ä¸æ åå§å¼ç reduce()
代ç ï¼
const array = [15, 16, 17, 18, 19];
function reducer(accumulator, currentValue, index) {
const returns = accumulator + currentValue;
console.log(
`accumulator: ${accumulator}, currentValue: ${currentValue}, index: ${index}, returns: ${returns}`,
);
return returns;
}
array.reduce(reducer);
åè°å½æ°ä¼è¢«è°ç¨åæ¬¡ï¼æ¯æ¬¡è°ç¨çåæ°åè¿åå¼å¦ä¸è¡¨ï¼
accumulator
currentValue
index
è¿åå¼ ç¬¬ä¸æ¬¡è°ç¨ 15
16
1
31
ç¬¬äºæ¬¡è°ç¨ 31
17
2
48
ç¬¬ä¸æ¬¡è°ç¨ 48
18
3
66
ç¬¬åæ¬¡è°ç¨ 66
19
4
85
array
忰卿´ä¸ªè¿ç¨ä¸å§ç»ä¸ä¼æ¹åââå®å§ç»æ¯ [15, 16, 17, 18, 19]
ãreduce()
è¿åçå¼å°æ¯æå䏿¬¡åè°è¿åå¼ï¼85
ï¼ã
å¨è¿éï¼æä»¬ä»¥ç¸åçç®æ³ reduce åä¸ä¸ªæ°ç»ï¼ä½æä¾ 10
ä½ä¸º initialValue
ï¼
[15, 16, 17, 18, 19].reduce(
(accumulator, currentValue) => accumulator + currentValue,
10,
);
åè°å½æ°ä¼è¢«è°ç¨äºæ¬¡ï¼æ¯æ¬¡è°ç¨çåæ°åè¿åå¼å¦ä¸è¡¨ï¼
accumulator
currentValue
index
è¿åå¼ ç¬¬ä¸æ¬¡è°ç¨ 10
15
0
25
ç¬¬äºæ¬¡è°ç¨ 25
16
1
41
ç¬¬ä¸æ¬¡è°ç¨ 41
17
2
58
ç¬¬åæ¬¡è°ç¨ 58
18
3
76
ç¬¬äºæ¬¡è°ç¨ 76
19
4
95
è¿ç§æ
åµä¸ reduce()
è¿åç弿¯ 95
ã
为äºå¯¹å
å«å¨å¯¹è±¡æ°ç»ä¸çå¼è¿è¡æ±åï¼å¿
é¡»æä¾ä¸ä¸ª initialValue
ï¼ä»¥ä¾¿æ¯ä¸ªé¡¹é½éè¿åè°å½æ°å¤çã
const objects = [{ x: 1 }, { x: 2 }, { x: 3 }];
const sum = objects.reduce(
(accumulator, currentValue) => accumulator + currentValue.x,
0,
);
console.log(sum); // 6
å±å¹³åµå¥æ°ç»
const flattened = [
[0, 1],
[2, 3],
[4, 5],
].reduce((accumulator, currentValue) => accumulator.concat(currentValue), []);
// flattened ç弿¯ [0, 1, 2, 3, 4, 5]
ç»è®¡å¯¹è±¡ä¸å¼çåºç°æ¬¡æ°
const names = ["Alice", "Bob", "Tiff", "Bruce", "Alice"];
const countedNames = names.reduce((allNames, name) => {
const currCount = allNames[name] ?? 0;
return {
...allNames,
[name]: currCount + 1,
};
}, {});
// countedNames ç弿¯ï¼
// { 'Alice': 2, 'Bob': 1, 'Tiff': 1, 'Bruce': 1 }
æå±æ§å¯¹å¯¹è±¡è¿è¡åç»
const people = [
{ name: "Alice", age: 21 },
{ name: "Max", age: 20 },
{ name: "Jane", age: 20 },
];
function groupBy(objectArray, property) {
return objectArray.reduce((acc, obj) => {
const key = obj[property];
const curGroup = acc[key] ?? [];
return { ...acc, [key]: [...curGroup, obj] };
}, {});
}
const groupedPeople = groupBy(people, "age");
console.log(groupedPeople);
// {
// 20: [
// { name: 'Max', age: 20 },
// { name: 'Jane', age: 20 }
// ],
// 21: [{ name: 'Alice', age: 21 }]
// }
使ç¨å±å¼è¯æ³å initialValue è¿æ¥å
å«å¨å¯¹è±¡æ°ç»ä¸çæ°ç»
// friendsââä¸ä¸ªå¯¹è±¡æ°ç»ï¼å
¶ä¸å¯¹è±¡å段âbooksâæ¯æå欢ç书çå表
const friends = [
{
name: "Anna",
books: ["Bible", "Harry Potter"],
age: 21,
},
{
name: "Bob",
books: ["War and peace", "Romeo and Juliet"],
age: 26,
},
{
name: "Alice",
books: ["The Lord of the Rings", "The Shining"],
age: 18,
},
];
// allbooksââå表ï¼å
¶ä¸å
嫿ææåç书ç±å initialValue ä¸å
å«çéå å表
const allbooks = friends.reduce(
(accumulator, currentValue) => [...accumulator, ...currentValue.books],
["Alphabet"],
);
console.log(allbooks);
// [
// 'Alphabet', 'Bible', 'Harry Potter', 'War and peace',
// 'Romeo and Juliet', 'The Lord of the Rings',
// 'The Shining'
// ]
æ°ç»å»é
夿³¨ï¼ å¯ä»¥ä½¿ç¨ Set
å Array.from()
æ¥å®ç°ç¸åçææï¼å¦ const arrayWithNoDuplicates = Array.from(new Set(myArray))
ï¼å¹¶ä¸æ§è½æ´å¥½ã
const myArray = ["a", "b", "a", "b", "c", "e", "e", "c", "d", "d", "d", "d"];
const myArrayWithNoDuplicates = myArray.reduce((accumulator, currentValue) => {
if (!accumulator.includes(currentValue)) {
return [...accumulator, currentValue];
}
return accumulator;
}, []);
console.log(myArrayWithNoDuplicates);
ä½¿ç¨ reduce() æ¥æ¿ä»£ .filter().map()
ä½¿ç¨ filter()
å map()
ä¼éåæ°ç»ä¸¤æ¬¡ï¼ä½æ¯ä½ å¯ä»¥ä½¿ç¨ reduce()
åªéå䏿¬¡å¹¶å®ç°ç¸åçææï¼ä»èæ´é«æãï¼å¦æä½ 忬¢ä½¿ç¨ for
循ç¯ï¼ä½ å¯ä»¥å¨éå䏿¬¡æ¶ä½¿ç¨ forEach()
è¿è¡è¿æ»¤åæ å°ãï¼
const numbers = [-5, 6, 2, 0];
const doubledPositiveNumbers = numbers.reduce((accumulator, currentValue) => {
if (currentValue > 0) {
const doubled = currentValue * 2;
return [...accumulator, doubled];
}
return accumulator;
}, []);
console.log(doubledPositiveNumbers); // [12, 4]
æé¡ºåºè¿è¡ Promise
/**
* 龿¥ä¸ç³»å Promise å¤çç¨åºã
*
* @param {array} arrââä¸ä¸ª Promise å¤çç¨åºåè¡¨ï¼æ¯ä¸ªå¤çç¨åºæ¥æ¶åä¸ä¸ªå¤çç¨åºè§£å³çç»æå¹¶è¿åå¦ä¸ä¸ª Promiseã
* @param {*} inputââå¼å§è°ç¨ Promise é¾çåå§å¼
* @return {Object}ââç±ä¸ç³»å Promise 龿¥èæç Promise
*/
function runPromiseInSequence(arr, input) {
return arr.reduce(
(promiseChain, currentFunction) => promiseChain.then(currentFunction),
Promise.resolve(input),
);
}
// Promise 彿° 1
function p1(a) {
return new Promise((resolve, reject) => {
resolve(a * 5);
});
}
// Promise 彿° 2
function p2(a) {
return new Promise((resolve, reject) => {
resolve(a * 2);
});
}
// 彿° 3ââå°ç± `.then()` å
è£
å¨å·²è§£å³ç Promise ä¸
function f3(a) {
return a * 3;
}
// Promise 彿° 4
function p4(a) {
return new Promise((resolve, reject) => {
resolve(a * 4);
});
}
const promiseArr = [p1, p2, f3, p4];
runPromiseInSequence(promiseArr, 10).then(console.log); // 1200
使ç¨å½æ°ç»åå®ç°ç®¡é
// ç»å使ç¨çæå»ºå
const double = (x) => 2 * x;
const triple = (x) => 3 * x;
const quadruple = (x) => 4 * x;
// 彿°ç»åï¼å®ç°ç®¡éåè½
const pipe =
(...functions) =>
(initialValue) =>
functions.reduce((acc, fn) => fn(acc), initialValue);
// ç»åç彿°ï¼å®ç°ç¹å®å¼ç乿³
const multiply6 = pipe(double, triple);
const multiply9 = pipe(triple, triple);
const multiply16 = pipe(quadruple, quadruple);
const multiply24 = pipe(double, triple, quadruple);
// ç¨ä¾
multiply6(6); // 36
multiply9(9); // 81
multiply16(16); // 256
multiply24(10); // 240
å¨ç¨çæ°ç»ä¸ä½¿ç¨ reduce()
reduce()
ä¼è·³è¿ç¨çæ°ç»ä¸ç¼ºå¤±çå
ç´ ï¼ä½ä¸ä¼è·³è¿ undefined
å¼ã
console.log([1, 2, , 4].reduce((a, b) => a + b)); // 7
console.log([1, 2, undefined, 4].reduce((a, b) => a + b)); // NaN
å¨éæ°ç»å¯¹è±¡ä¸è°ç¨ reduce()
reduce()
æ¹æ³è¯»å this
ç length
屿§ï¼ç¶åè®¿é®æ¯ä¸ªæ´æ°ç´¢å¼ã
const arrayLike = {
length: 3,
0: 2,
1: 3,
2: 4,
};
console.log(Array.prototype.reduce.call(arrayLike, (x, y) => x + y));
// 9
è§è æµè§å¨å
¼å®¹æ§ åè§
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