1. コンセプト
reduce は配列を走査し、コールバック関数の 2 つの値はそれぞれ論理演算の累積結果と現在の値を表し、配列などを累積するためによく使用されます。
関数の構文を減らす
arr.reduce(function (previousValue, currentValue) { /*logical function */ },initialValue) arr: 配列を走査することを意味しますpreviousValue: 配列の累積結果を関数本体で返す必要がありますcurrentValue: 現在の値arr 配列トラバーサル項目のInitialValue: 初期値を示します。省略可能です。入力されていない場合、previousValue は配列の最初の項目、currentValue は配列の 2 番目の項目です。入力されている場合、previousValue は初期値、currentValue は配列の最初の項目です。配列。
2. いくつかの一般的なアプリケーション シナリオ
①. 配列を累積して合計する
let arr = [1, 2, 3, 4, 5, 6]
var sum = 0
sum = arr.reduce(function (sum, cur) {
sum += cur
return sum
}, 0)
console.log(sum)
②、オブジェクト配列内の値の合計
let arr2 = [{
subject: '数学',
marks: 78
},
{
subject: '物理',
marks: 80
},
{
subject: '化学',
marks: 93
}
]
let sum = 0
sum = arr2.reduce(function (sum, cur) {
sum += cur.marks
return sum
}, 0)
console.log('分数之和是', sum)
③、配列を平坦化(多次元配列を一次元に変換)
let arr3 = [ [1,2], [3,4], [5,6], [7,8] , [9,10] ];
let sum = []
sum = arr3.reduce(function(sum,arr){
// sum.push(...arr)两种都可以
sum = sum.concat(arr)
return sum
},[])
console.log(sum)
④. オブジェクトを属性ごとにグループ化(スコアが 50 点以上の場合は合格、スコアが 50 点未満の場合は不合格)
let arr3 = [{
subject: '物理',
marks: 41
},
{
subject: '化学',
marks: 59
},
{
subject: '高等数学',
marks: 36
},
{
subject: '应用数学',
marks: 90
},
{
subject: '英语',
marks: 64
},
];
let obj = {
pass: [],
fail: []
}
obj = arr3.reduce(function (obj, cur) {
cur.marks >= 50 ? obj.pass.push(cur) : obj.fail.push(cur)
return obj
}, obj)
console.log(obj)
⑤. 集合 A={a, b}、集合 B={0, 1, 2} とすると、2 つの集合のデカルト積は {(a, 0), (a, 1), (a, 2) となります。 , (b, 0), (b, 1), (b, 2)}。A={a, b, …, n}、B={0, 1, 2, …, n} のときのデカルト積を求めます。
let arr = [
[{
a: 1,
b: 2
}, 'c'],
[1, 2, 3],
[7, 8, 9]
]
let arrs
arr.reduce(function (sum, cur) {
console.log(sum, 'sum-----')
console.log(cur, 'cur-----')
arrs = []
for (var i = 0; i < sum.length; i++) {
for (var j = 0; j < cur.length; j++) {
let temparr = []
console.log(Array.isArray(sum[i]))
Array.isArray(sum[i]) ? temparr = temparr.concat(sum[i]) : temparr.push(sum[i])
temparr.push(cur[j])
arrs.push(temparr)
}
}
return arrs
})
console.log(arrs,'arrs------------')