reduce()
アレイ内の各要素の一つの方法を行う自定义
のreducer
(オーダー実行を昇順で)機能は、単一の戻り値の結果を要約
const array = [1, 2, 3, 4];
const reducer = (accumulator, currentValue) => accumulator + currentValue;
const a = array.reduce(reducer); // 1 + 2 + 3 + 4
console.log(a); // 10
const b = array.reduce(reducer, 5); // 5 + 1 + 2 + 3 + 4
console.log(b); // 15
reducer
関数は、次の4つのパラメータを受け取ります。
- アキュムレータ(ACC)(積算計)
- 電流値(CUR)(現在値)
- 現在のインデックス(IDX)(現在のインデックス)
- ソース配列(SRC)(ソース配列)
アキュムレータに割り当てられ、あなたの減速関数の戻り値は、戻り値は、配列の各反復で覚えて、そして最後に究極の単一の結果値となっています
文法
arr.reduce(コールバック(ACC、CUR、IDX、SRC)、はinitialValue)
パラメータ:
折り返し電話
accumulator
アキュムレータコールバックの戻り値を蓄積し、それがコールバックの前の呼び出しによって返された累積値であり、又はinitialValue
(下記参照)currentValue
処理された配列の要素index (可选)
配列内の現在の要素のインデックスは処理されています。提供される場合initialValue
、開始インデックス番号は0であり、1又はインデックスから始まりますarray (可选)
コールreduce()
配列
initialValue(オプション)
- 最初の引数としてときにコールバック関数値の最初の呼び出し。いいえ初期値場合、配列内の最初の要素が使用されます。初期値なしで空の配列に呼び出し、エラーが減少します
返却値
機能の統合プロセスの結果
アプリケーション
すべての値の計算アレイと
var sum = [0,1,2,3].reduce(
(acc, cur)=> acc + cur,
0
)
console.log(sum)
配列内のオブジェクトの累積値
const arr = [{x: 1}, {x: 2}, {x: 3}]
let sum = arr.reduce(
(acc, cur)=> acc + cur.x,
0
)
console.log(sum)
一次元アレイに二次元アレイ
const arr = [[0, 1], [2, 3], [4, 5]]
let change = arr.reduce(
(acc, cur)=> acc.concat(cur),
[]
)
console.log(change)
各配列要素が表示さの計算の数
const names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']
let count = names.reduce(
(allnames, name)=> {
if(name in allnames) {
allnames[name]++
}else {
allnames[name] = 1
}
return allnames
},
{}
)
console.log(count)
// console
[object Object] {
Alice: 2,
Bob: 1,
Bruce: 1,
Tiff: 1
}
属性オブジェクトの分類により、
const people = [
{ name: 'Alice', age: 21 },
{ name: 'Max', age: 20 },
{ name: 'Jane', age: 20 }
];
let groupBy = (all, select)=> {
return all.reduce(
(acc, obj)=> {
let key = obj[select]
if(!acc[key]) {
acc[key] = []
}
acc[key].push(obj)
return acc
}, {}
)
}
let groupedPeople = groupBy(people, 'age')
console.log(groupedPeople)
// console
{
20: [
{ name: 'Max', age: 20 },
{ name: 'Jane', age: 20 }
],
21: [
{ name: 'Alice', age: 21 }
]
}
拡張されたアレイは、結合演算子を初期値と対象配列に含まれています
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
}];
let allbooks = friends.reduce(
(acc, cur)=> [...acc, ...cur.books],
[]
);
console.log(allbooks);
// console
["Bible", "Harry Potter", "War and peace", "Romeo and Juliet", "The Lord of the Rings", "The Shining"]
重複排除アレイ
const arr = ['a', 'b', 'a', 'b', 'c', 'e', 'e', 'c', 'd', 'd', 'd', 'd'];
let newArr = arr.reduce(
(acc, cur)=> {
if(acc.indexOf(cur) === -1) {
acc.push(cur)
}
return acc
}, []
)
console.log(newArr) // ["a", "b", "c", "e", "d"]
// 同上方法,判断 acc 数组里有没有 cur ,没有就往里加
let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4];
let newArr = arr.sort().reduce(
(acc, cur)=> {
if(acc.indexOf(cur) === -1) {
acc.push(cur)
}
return acc
}, []
)
console.log(newArr) // [1, 2, 3, 4, 5]
// 判断 acc 初始值为空,或者 acc 最后的值不为 cur (arr数组中最后一项)
let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4];
let result = arr.sort().reduce((init, current) => {
if(init.length === 0 || init[init.length-1] !== current) {
init.push(current);
}
return init;
}, []);
console.log(result); // [1,2,3,4,5]
約束を実行するためには、
let runPromiseInSequence = (arr, input) => arr.reduce(
(promiseChain, currentFun) => promiseChain.then(currentFun),
Promise.resolve(input)
)
let p1 = (a) => (new Promise((res, rej)=> {
res(a*5)
}))
let p2 = (a) => (new Promise((res, rej)=> {
res(a*2)
}))
let f3 = (a) => a * 3
let f4 = (a) => a * 4
const promiseArr = [p1, p2, f3, f4]
runPromiseInSequence(promiseArr, 10)
.then(console.log) // 1200