我有一個物件 student,它有屬性 id、name、groupName。allStudents是student物件的陣列,我想把它變成一個id到student map,但是對于每個student,我想生成一個新的屬性“label”,如果student有groupName,label值為“name groupName” ,否則為名稱。所以我寫了下面的代碼,它有效:
const idsToStudents = allStudents.reduce((tempMap, student) => {
const getStudentLabel = (student) => {
if (student.groupName) {
return [student.name, `(${student.groupName})`].join(' ');
}
return student.name;
};
const studentLabel = getStudentLabel(student);
return {
...tempMap,
[student.id]: { ...student, label: studentLabel}
};
}, {});
我在 reducer 函式中定義了 getStudentLabel 函式,有沒有更好的方法來代替在 reducer 函式中一次又一次地宣告 getStudentLabel 函式?您可以忽略 getStudentLabel 究竟做了什么,只是認為它將每個人作為引數并根據人回傳一些東西,有沒有辦法只定義一次函式,但我仍然可以為減速器中的每個人呼叫它?
謝謝!
uj5u.com熱心網友回復:
您將student作為引數傳遞給函式,因此無需在reduce. 這也可以:
const getStudentLabel = (student) => {
if (student.groupName) {
return [student.name, `(${student.groupName})`].join(' ');
}
return student.name;
};
const idsToStudents = allStudents.reduce((tempMap, student) => {
const studentLabel = getStudentLabel(student);
return {
...tempMap,
[student.id]: { ...student, label: studentLabel}
};
}, {});
您還可以稍微縮短代碼:
const getStudentLabel = ({ name, groupName }) => groupName
? `${name} (${groupName})`
: name;
const idsToStudents = allStudents.reduce((tempMap, student) => ({
...tempMap,
[student.id]: { ...student, label: getStudentLabel(student) }
}), {});
uj5u.com熱心網友回復:
我不會擔心在閉包中重新定義函式。任何合理的 javascript 實作都會對其進行優化,以便使用最少的額外記憶體。我不會說你不止一次“定義”這個函式是準確的——你只在你的代碼中定義了一次。該函式每次都被實體化,但該實體化將利用該函式靜態部分的快取。所以你這樣做的方式非常好。作為大利德羅里提到的,你不必須有在內部函式中的學生變數,但它可能是一個好主意,無論如何,讓你對功能的依賴性非常明確的。
uj5u.com熱心網友回復:
Object.fromEntries可以代替reduce.
const getStudentLabel = ({name, groupName}) => groupName
? name ` (${groupName})`
: name;
const idsToStudents = Object.fromEntries(
allStudents.map(student => [student.id, { ...student, label: getStudentLabel(student) }])
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/340781.html
標籤:javascript 数组 功能 目的 减速机
上一篇:從下面的代碼中,根據第2行條件-如果骰子===6代碼必須停止!在第4行重新分配骰子變數有什么需要?(我是一個begnr)
