js配列方法reduce奇術
3637 ワード
前言
最近は「JavaScript高級プログラム設計」を読んでいますが、中には行列のタイプを紹介しています.これまであまり見たことがない方法があります.システムの把握もないので、この方法は大いに使えます.また、プログラミングのB格を高める可能性があるので、記録しておきます.
本の中の内容を紹介します.
関数の互換性が見られますか?
まずパラメータを紹介します.reduceとreduceRightは両方のパラメータを受け入れます.一つは関数で、一つはオプションのパラメータです.一つは左から遍歴して、一つは右からです.
二つ目のパラメータinitial Valueがあると、initial Valueが関数としての最初のパラメータprevious Valueであり、ない場合は、行列の第一項[0]がprevious Valueとして、第二項[0]として、currentValueとして、つまり、第二のパラメータがない場合は、配列を参照してください.
本の中で一つの実例を提供します.以前の求和はfor循環アキュムレータですが、本の中の書き方はもっと高いようです.しかし、プログラムを書く時には詰め物をしてはいけません.他の用法がありますか?
簡単な例
和を乞う
そうすると、配列の他の演算、積積、乗乗乗乗などができます.
高級な使い方
配列
最近は「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