您能否建議任何更短的代碼來解決以下問題。我有物件陣列:
const arr1=[
{ '1': { grade: 1.3, counter: 2 } },
{ '1': { grade: 2.8, counter: 2 } },
{ '2': { grade: 4.5, counter: 1 } },
{ '2': { grade: 2.4, counter: 1 } }
]
輸出應如下所示:
const obj1={
'1': {grade:4.1,counter:4}
'2': {grade:6.9,counter:2}
}
這是我嘗試過的代碼:
arr1.reduce((acc,e)=> {
let element = Object.keys(e)
if(!acc.hasOwnProperty(element)){
acc[element]={grade:0,counter:0}
}
acc[element].grade = e[element].grade
acc[element].counter = e[element].counter
return acc
}, {})
謝謝
uj5u.com熱心網友回復:
您的問題是Object.keys(e)
回傳一個鍵陣列而不是單個鍵。
如果您的物件將始終相同(使用一把鑰匙),您可以通過以下方式獲取鑰匙:let element = Object.keys(e)[0]
我用兩個主要部分分解了代碼。
- 獲取當前專案的密鑰(使用
const key = Object.keys(current)[0]
) - 檢查 newObject 是否有密鑰
- 如果是:使用當前物件更新等級和計數器值
- 如果否:將當前物件添加到鍵中
const arr1 = [{
'1': {
grade: 1.3,
counter: 2
}
},
{
'1': {
grade: 2.8,
counter: 2
}
},
{
'2': {
grade: 4.5,
counter: 1
}
},
{
'2': {
grade: 2.4,
counter: 1
}
}
]
const newObject = arr1.reduce((newObject, current) => {
const key = Object.keys(current)[0]
const associatedObject = newObject[key]
if (associatedObject) {
associatedObject.grade = current[key].grade
associatedObject.counter = current[key].counter
} else {
newObject[key] = current[key]
}
return newObject
}, {})
console.log(newObject)
uj5u.com熱心網友回復:
Object.keys
回傳一個字串陣列,所以要在這里檢查你可能需要第一個:
arr1.reduce((acc, e) => {
const element = Object.keys(e)[0]; // `[0]` accesses the first key
if(!acc.hasOwnProperty(element)){
acc[element]={grade:0,counter:0}
}
acc[element].grade = e[element].grade
acc[element].counter = e[element].counter
return acc
}, {});
然后,您可以使用新的邏輯空賦值運算子代替 if 陳述句:
arr1.reduce((acc, e) => {
const element = Object.keys(e)[0];
acc[element] ??= { grade: 0, counter: 0 };
acc[element].grade = e[element].grade;
acc[element].counter = e[element].counter;
return acc
}, {});
在它開始變得毫無意義之前,這可能就像我所說的一樣短。
更深入; 使用無效合并和可選鏈接:
arr1.reduce((acc, e) => {
const element = Object.keys(e)[0];
acc[element] = {
grade: (acc[element]?.grade ?? 0) e[element].grade,
counter: (acc[element?.counter ?? 0) e[element].counter,
};
return acc
}, {});
在Object.assign
一行中完成所有操作:
arr1.reduce((acc, e) => {
const element = Object.keys(e)[0];
return Object.assign(acc, {
[element]: {
grade: (acc[element]?.grade ?? 0) e[element].grade,
counter: (acc[element?.counter ?? 0) e[element].counter,
},
});
}, {});
最后,只是為了好玩,讓我們完全行內element
變數以獲得這條驚人的行:
arr1.reduce((acc, e) => Object.assign(acc, {
[Object.keys(e)[0]]: {
grade: (acc[Object.keys(e)[0]]?.grade ?? 0) e[Object.keys(e)[0]].grade,
counter: (acc[Object.keys(e)[0]]?.counter ?? 0) e[Object.keys(e)[0]].counter,
},
}), {});
uj5u.com熱心網友回復:
我會去:
arr1.reduce((o,n)=>{
Object.keys(n).forEach((key)=>{
if(!o[key]) o[key]={grade:0, counter:0};
o[key]["grade"] = n[key]["grade"];
o[key]["counter"] = n[key]["counter"];
});
return o;
},{});
Step1:對陣列進行歸約,acc = {}
Step2:遍歷當前索引處物件的每個鍵
Step3:總結相應的屬性
您忘記遍歷 keys。
評論:作為pons asinorum,我使用array.reduce()
變數名:
o
表示舊值(=acc=_accumulator)n
意義新的價值。
uj5u.com熱心網友回復:
另一種解決方案是:
const obj1 = arr1.reduce((acc, value) => {
if(acc[Object.keys(value)[0]]) {
acc[Object.keys(value)[0]].grade = acc[Object.keys(value)[0]].grade value[Object.keys(value)[0]].grade;
acc[Object.keys(value)[0]].counter = acc[Object.keys(value)[0]].counter value[Object.keys(value)[0]].counter;
} else {
acc[Object.keys(value)[0]] = value[Object.keys(value)[0]];
}
return acc;
})
uj5u.com熱心網友回復:
試試這個
let arr1=[{'1': {grade: 1.3, counter: 2}},{'1': {grade: 2.8, counter: 2}},{'2': {grade: 4.5, counter: 1}},{'2': {grade: 2.4, counter: 1}}];
arr1 = arr1.reduce((acc, obj) => {
let [k, v] = Object.entries(obj)[0];
if(!acc.hasOwnProperty(k)) acc[k] = {grade:0,counter:0};
acc[k].grade = v.grade;
acc[k].counter = v.counter;
return acc
}, {});
console.log(arr1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/468497.html
標籤:javascript