我已經閱讀了這篇文章,但我似乎沒有正確理解 JavaScript 的 reduce 語法。如何將附加引數傳遞給自定義減速器函式?
呼叫減速器函式。
data = Object.values(data.reduce(reducer, {}));
減速器功能示例。
const reducer = (acc, cur) => {
if (somethingIsTrue) {
return acc;
}
};
現在它像它應該的那樣作業,但是假設我正在呼叫 reducer 函式并且我想傳遞包含“Hello World”的簡單變數,該函式不會將其視為引數。我怎樣才能做到這一點?
uj5u.com熱心網友回復:
您可以進行函陣列合以“構建”稱為高階函式的東西。基本上這個想法是創建一個回傳“子函式”的函式,該函式可以訪問父函式的變數。
// Parent function (getReducer)
function getReducer(stringToAppend) {
// Child function (reducer)
function reducer(acc, curr) {
// Child function has access to parent's variables (in this case stringToAppend)
acc[curr] = stringToAppend curr
return acc
}
return reducer
}
const data = [0,1,2,3,4,5,6,7,8,9]
const result = data.reduce(getReducer("Hello World "), {})
console.log('result :>> ', result);
在控制臺中:
result :>> {
'0': 'Hello World 0',
'1': 'Hello World 1',
'2': 'Hello World 2',
'3': 'Hello World 3',
'4': 'Hello World 4',
'5': 'Hello World 5',
'6': 'Hello World 6',
'7': 'Hello World 7',
'8': 'Hello World 8',
'9': 'Hello World 9'
}
我使用了function語法,因為我發現它更冗長和明確來解釋這一點。你當然可以使用箭頭函式。使用箭頭語法,該函式看起來很簡單:
function getReducer (stringToAppend) {
return (acc, curr) => {
acc[curr] = stringToAppend curr
return acc
}
}
uj5u.com熱心網友回復:
看起來您想通過使用一個值(這也可以是一個函式)進行分組來對資料進行分組。
例如,獲取由偶數個奇數值分隔的所有值。
首先,您需要一個回傳標志來分隔值的函式,例如
v => v % 2 // even -> 0, odd -> 1
然后采用減速器功能,例如
(acc, value) => {
// fn is not defined here, but it works a grouping function
// the following line reads:
// if acc[fn(value)] is undefined or null assign an empty array
// then push a value
(acc[fn(value)] ??= []).push(value);
return acc;
}
現在你需要通過在引數的開頭添加一個閉包來組合這兩個函式fn:
fn => (acc, value) => {
// rest is the same
最后呼叫函式
const
evenOrOdd = v => v % 2,
reducer = fn => (acc, value) => {
(acc[fn(value)] ??= []).push(value);
return acc;
},
data = [2, 7, 9, 4, 3, 5, 1],
result = Object.values(data.reduce(
reducer(evenOrOdd),
{}
));
console.log(result);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/399084.html
標籤:javascript 数组 反应 目的
上一篇:for回圈中的return陳述句
