js配列方法reduce奇術

3637 ワード

前言
最近は「JavaScript高級プログラム設計」を読んでいますが、中には行列のタイプを紹介しています.これまであまり見たことがない方法があります.システムの把握もないので、この方法は大いに使えます.また、プログラミングのB格を高める可能性があるので、記録しておきます.
本の中の内容を紹介します.
関数の互換性が見られますか?
まずパラメータを紹介します.reduceとreduceRightは両方のパラメータを受け入れます.一つは関数で、一つはオプションのパラメータです.一つは左から遍歴して、一つは右からです.
arr.reduce(callback,[initialValue])
このcalbackはまた4つのパラメータが受け入れられます.全部選択できます.
    1、previousValue (           ,         (initialValue))
    2、currentValue (           )
    3、index (           )
    4、array (   reduce    )
戻り値:最初のパラメータ->つまり関数は、戻り値はいずれも最初のパラメータとして次のエントリに渡されます.このプロセスは、配列の各項目を巡回し、最後の関数の戻り値を直接reduceの戻り値として返します.
二つ目のパラメータinitial Valueがあると、initial Valueが関数としての最初のパラメータprevious Valueであり、ない場合は、行列の第一項[0]がprevious Valueとして、第二項[0]として、currentValueとして、つまり、第二のパラメータがない場合は、配列を参照してください.
本の中で一つの実例を提供します.以前の求和はfor循環アキュムレータですが、本の中の書き方はもっと高いようです.しかし、プログラムを書く時には詰め物をしてはいけません.他の用法がありますか?
簡単な例
和を乞う
var arr = [1, 2, 3, 4];
var sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);//     (1, 2, 1),    (3, 3, 2),    (6, 4, 3)
    return prev + cur;
})
console.log(arr, sum);// [1, 2, 3, 4],10
初期値0を設定します.
var arr = [1, 2, 3, 4];
var sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);//     (0, 1, 0),    (1, 2, 2),    (3, 3, 3),     (6, 4, 4)
    return prev + cur;
}, 0)
console.log(arr, sum);// [1, 2, 3, 4],10
注意:reduceに第二のパラメータinitial Valueがない場合、配列は空です.関数にパラメータprevがあると、最初の項目が見つからないので、エラーが発生します.
そうすると、配列の他の演算、積積、乗乗乗乗などができます.
高級な使い方
配列
var arr = [1, 2, 3, 3, 4, 2]
var newArr = arr.reduce((prev, cur) => {
    if (!prev.includes(cur)) {
        return prev.concat(cur)
    } else {
        return prev
    }
}, [])
console.log(newArr)// [1, 2, 3, 4]
オブジェクトの削除
var arr = [
    {id: 0, name: "  "},
    {id: 1, name: "  "},
    {id: 2, name: "  "},
    {id: 3, name: "  "},
    {id: 1, name: "  "},
    {id: 2, name: "  "}
]
var obj = {}
var newArr = arr.reduce((pre, cur) => {
    obj[cur.id] ? '' : obj[cur.id] = true && pre.push(cur);
    return pre
}, [])
console.log(newArr)
// 0: {id: 0, name: "  "}
// 1: {id: 1, name: "  "}
// 2: {id: 2, name: "  "}
// 3: {id: 3, name: "  "}
どうやって重いですか
let arr = [1, 2, 3, 3, 4, 2]
let newArr = Array.from(new Set(arr))
console.log(newArr)// [1, 2, 3, 4]
配列内の各要素の出現回数を計算します.
let arr = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];

let arrNum = arr.reduce((prev,cur)=>{
  if(cur in prev){
    prev[cur]++
  }else{
    prev[cur] = 1 
  }
  return prev
},{})
console.log(arrNum); //{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}
二次元配列を一次元に変換
let arr = [[0, 1], [2, 3], [4, 5]]
let newArr = arr.reduce((pre,cur)=>{
    return pre.concat(cur)
},[])
console.log(newArr); // [0, 1, 2, 3, 4, 5]
多次元配列を一次元に変換
let arr = [[0, 1], [2, 3], [4,[5,6,7]]]
const newArr = function(arr){
   return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])
}
console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]
オブジェクトの属性の合計
var result = [
    {
        subject: 'math',
        score: 10
    },
    {
        subject: 'chinese',
        score: 20
    },
    {
        subject: 'english',
        score: 30
    }
];
var sum = result.reduce(function(prev, cur) {
    return cur.score + prev;
}, 0);
console.log(sum) //60