Array.prototype.reduce()が使用するのは簡単です(続き...)

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つのパラメータを受け取ります。

  1. アキュムレータ(ACC)(積算計)
  2. 電流値(CUR)(現在値)
  3. 現在のインデックス(IDX)(現在のインデックス)
  4. ソース配列(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
公開された23元の記事 ウォンの賞賛0 ビュー571

おすすめ

転載: blog.csdn.net/JIANLI0123/article/details/103390955