配列の対象からJavascriptのreduceを見直す()

4913 ワード

このような配列があると仮定します.
let person = [
     {id: 0, name: "  "},
     {id: 1, name: "  "},
     {id: 2, name: "  "},
     {id: 3, name: "  "},
     {id: 1, name: "  "},
     {id: 2, name: "  "},   
]
私達は配列中のidの重複する対象を取り除きたいです.例えば同じidが2の対象です.
{id: 2, name: "  "} {id: 2, name: "  "} (         )
私たちはどうすればいいですか?
実際には、配列の対象に対して、伝統的な方法は無力で、forEach()、filter()などの反復方法も使いにくいです.本当に優雅に重きを置くことができるのは、ES 5の新たな増加の一つの方法——reduce()です.
reduce()方法は第一パラメータとして一つのコールバック関数を受信し、コールバック関数はまた四つのパラメータを受け取ります.それぞれ:
 
1.previous Value=>初期値または前回のコールバック関数が重畳した値.
2.current Value => 今回のコールバック(ループ)は実行する値です.
3.index=>「currentValue」のインデックス値.
4.arr=>配列自体
 reduce()メソッドは最後にコールバック関数の戻り値を返します.
let log = console.log.bind(console);
let arr = [1,2,3,4,5,6];
arr = arr.reduce((previousValue, currentValue) => {
     return previousValue + currentValue; //                ,15+6;
})
log(arr); // 21
上のコードの最終結果は1+2+3+4+5+6=21です.
さらに、reduceは、第2のパラメータinitial Valueを受信して、コールバック関数(第1のパラメータ)のprevious Valueのタイプと初期値を宣言するために使用されてもよい.
let log = console.log.bind(console);
let arr = [1,2,3,4,5,6];
arr = arr.reduce((previousValue,currentValue) => {
     return previousValue + currentValue;
},0) //  cur    Number      0,   1 ,       22
log(arr); // 21
 
注意したいのは、initial Valueの値が設定されている場合、第1回のコールバック関数を実行するprevious Valueの値はinitial Valueに等しい.このとき、現在のインデックスを参照すると0になる.ただし、initial Valueの値を設定しないと、previous Valueの値は配列の最初の項目であり、インデックス値(index)は1である.つまり、初期値を設定しないとreduce()方法は実際には2回目のサイクルから始まります.
文章の最初の配列に戻ります.
let log = console.log.bind(console);
let person = [
     {id: 0, name: "  "},
     {id: 1, name: "  "},
     {id: 2, name: "  "},
     {id: 3, name: "  "},
     {id: 1, name: "  "},
     {id: 2, name: "  "},   
];

let obj = {};

person = person.reduce((cur,next) => {
    obj[next.id] ? "" : obj[next.id] = true && cur.push(next);
    return cur;
},[]) //  cur       ,          
log(person);
personを印刷したら、私達は重い配列に行くことができます.
もちろん、redecu()はアキュムレスとデキストリン以外にも機能がたくさんあります.例えば、フラット化された多次元配列――
var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
    return a.concat(b);
}, []); // [0,1,2,3,4,5]
 
余談ですが、重いと言えば、ES 6のセットを思い出す人が多いです.でも、私の実験によって、Setは基本的なタイプに対して重いほうがいいです.Setの中の一つが対象であれば、重くはないです.jはある対象が同じでも、
let arr = new Set([
    {id: 0, name: "  "},
    {id: 0, name: "  "},
    {id: 0, name: "  "},
    {id: 0, name: "  "}      
]);
console.log([...arr]); //    4   
 
転載先:https://www.cnblogs.com/caideyipi/p/7679681.html