我無法解決這個問題,這是我的物件陣列
gamesAndChoosenNumbers: [
{
choosenNum: '15',
count: 10,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '15',
count: 5,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '16',
count: 20,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '16',
count: 20,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '16',
count: 10,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '150',
count: 10,
game: 'SUPER',
gameCode: 'super',
},
{
choosenNum: '150',
count: 10,
game: 'SUPER',
gameCode: 'super',
},
{
choosenNum: '155',
count: 20,
game: 'SUPER',
gameCode: 'super',
},
{
choosenNum: '155',
count: 20,
game: 'SUPER',
gameCode: 'super',
},
{
choosenNum: '200',
count: 10,
game: 'BOX',
gameCode: 'box',
},
{
choosenNum: '200',
count: 10,
game: 'BOX',
gameCode: 'box',
},
{
choosenNum: '155',
count: 20,
game: 'BOX',
gameCode: 'box',
},
];
所以我想根據 choosenNum和游戲值減少這個陣列并將它們合并并用所有其他相同物件**count'**s總和替換計數值,
我想要得到的結果是這個??
gamesAndChoosenNumbers: [
{
choosenNum: '15',
count: 15,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '16',
count: 50,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '150',
count: 20,
game: 'SUPER',
gameCode: 'super',
},
{
choosenNum: '155',
count: 40,
game: 'SUPER',
gameCode: 'super',
},
{
choosenNum: '200',
count: 20,
game: 'BOX',
gameCode: 'box',
},
{
choosenNum: '155',
count: 20,
game: 'BOX',
gameCode: 'box',
},
];
我嘗試了很多,但無法用這段代碼解決這個問題
const duplicateElementa = gamesAndChoosenNumbers.reduce((x, y, i) => {
console.log({ i, x, y });
if (x.map((it) => it.choosenNum).includes(y.choosenNum)) {
console.log({ i1: i, x1: x[i - 1], y1: y });
if (x[i - 1].game === y.game) {
return [...x, { ...y, count: x[i - 1]?.count y.count }];
}
} else {
return [...x, y];
}
}, []);
const nondupes = gamesAndChoosenNumbers.filter(
(it) => !dupeNums.includes(it.choosenNum),
);
const dupesMerged = duplicateElementa.map((it, i, arr) => {
const gt = arr.sort((a, b) => b.count - a.count);
const st = gt.reduce((x, y, i, carr) => {
if (
x.map((it) => it.choosenNum).includes(y.choosenNum) &&
x.map((it) => it.game).includes(y.game)
) {
return x;
} else {
return [...x, y];
}
}, []);
return st;
})[0];
const final: [] = dupesMerged
.filter((it) => {
console.log(nondupes.map((u) => u.choosenNum).includes(it.choosenNum));
if (!nondupes.map((u) => u.choosenNum).includes(it.choosenNum)) {
return it;
}
})
.concat(nondupes);
在這里,最終變數將有答案,但是當 155 在兩個代碼塊中重復時我被搞砸了!!!。我被卡住了??...,請幫助??。
uj5u.com熱心網友回復:
你把事情弄復雜了,下面是一個簡單的參考供你使用reduce()(由choosenNum和game組合一個新的鍵)
let data = [
{
choosenNum: '15',
count: 10,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '15',
count: 5,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '16',
count: 20,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '16',
count: 20,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '16',
count: 10,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '150',
count: 10,
game: 'SUPER',
gameCode: 'super',
},
{
choosenNum: '150',
count: 10,
game: 'SUPER',
gameCode: 'super',
},
{
choosenNum: '155',
count: 20,
game: 'SUPER',
gameCode: 'super',
},
{
choosenNum: '155',
count: 20,
game: 'SUPER',
gameCode: 'super',
},
{
choosenNum: '200',
count: 10,
game: 'BOX',
gameCode: 'box',
},
{
choosenNum: '200',
count: 10,
game: 'BOX',
gameCode: 'box',
},
{
choosenNum: '155',
count: 20,
game: 'BOX',
gameCode: 'box',
},
]
let result = data.reduce((a,c) =>{
let key = c.choosenNum '_' c.game
let obj = a.find(i => i.choosenNum '_' i.game == key )
if(!obj){
a.push({...c})
}else{
obj.count = c.count
}
return a
},[])
console.log(result)
uj5u.com熱心網友回復:
gamesAndChoosenNumbers = [{
choosenNum: '15',
count: 10,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '15',
count: 5,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '16',
count: 20,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '16',
count: 20,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '16',
count: 10,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '150',
count: 10,
game: 'SUPER',
gameCode: 'super',
},
{
choosenNum: '150',
count: 10,
game: 'SUPER',
gameCode: 'super',
},
{
choosenNum: '155',
count: 20,
game: 'SUPER',
gameCode: 'super',
},
{
choosenNum: '155',
count: 20,
game: 'SUPER',
gameCode: 'super',
},
{
choosenNum: '200',
count: 10,
game: 'BOX',
gameCode: 'box',
},
{
choosenNum: '200',
count: 10,
game: 'BOX',
gameCode: 'box',
},
{
choosenNum: '155',
count: 20,
game: 'BOX',
gameCode: 'box',
},
];
finalArr = gamesAndChoosenNumbers.reduce((acc, item) => {
const findObj = acc.findIndex(_item => item.choosenNum === _item.choosenNum && item.game === _item.game);
console.log(findObj)
if (findObj >= 0) {
acc[findObj] = {
...item,
count: item.count findObj.count,
}
return acc
}
return [...acc, item];
}, [])
console.log(finalArr);
uj5u.com熱心網友回復:
也許......使用這樣的物件?
const gamesAndChoosenNumbers = [
{choosenNum: '15', count: 10, game: 'AB', gameCode: 'double'},
{choosenNum: '15', count: 5, game: 'AB', gameCode: 'double'},
{choosenNum: '16', count: 20, game: 'AB', gameCode: 'double'},
{choosenNum: '16', count: 20, game: 'AB', gameCode: 'double'},
{choosenNum: '16', count: 10, game: 'AB', gameCode: 'double'},
{choosenNum: '150', count: 10, game: 'SUPER', gameCode: 'super'},
{choosenNum: '150', count: 10, game: 'SUPER', gameCode: 'super'},
{choosenNum: '155', count: 20, game: 'SUPER', gameCode: 'super'},
{choosenNum: '155', count: 20, game: 'SUPER', gameCode: 'super'},
{choosenNum: '200', count: 10, game: 'BOX', gameCode: 'box'},
{choosenNum: '200', count: 10, game: 'BOX', gameCode: 'box'},
{choosenNum: '155', count: 20, game: 'BOX', gameCode: 'box'},
];
const results = {}
gamesAndChoosenNumbers.forEach(obj => {
if(!results[obj.choosenNum obj.game]) results[obj.choosenNum obj.game] = obj;
else results[obj.choosenNum obj.game].count = obj.count;
});
console.log(Object.values(results));
uj5u.com熱心網友回復:
您可以簡單地reduce使用您的陣列并檢查您是否已經有一個具有與當前迭代的專案和屬性匹配的choosenNum屬性的專案:gamechoosenNumgame
- 如果是,那么只需將當前專案添加到縮減陣列
count中找到的專案。 - 如果沒有,只需將當前專案推送到縮減陣列。
這是一個現場演示:
const gamesAndChoosenNumbers = [{
choosenNum: '15',
count: 10,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '15',
count: 5,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '16',
count: 20,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '16',
count: 20,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '16',
count: 10,
game: 'AB',
gameCode: 'double',
},
{
choosenNum: '150',
count: 10,
game: 'SUPER',
gameCode: 'super',
},
{
choosenNum: '150',
count: 10,
game: 'SUPER',
gameCode: 'super',
},
{
choosenNum: '155',
count: 20,
game: 'SUPER',
gameCode: 'super',
},
{
choosenNum: '155',
count: 20,
game: 'SUPER',
gameCode: 'super',
},
{
choosenNum: '200',
count: 10,
game: 'BOX',
gameCode: 'box',
},
{
choosenNum: '200',
count: 10,
game: 'BOX',
gameCode: 'box',
},
{
choosenNum: '155',
count: 20,
game: 'BOX',
gameCode: 'box',
},
],
/**
* merge the items from "gamesAndChoosenNumbers" based on their "game" and "choosenNum" properties.
*/
merged = gamesAndChoosenNumbers.reduce((a, c) => {
// "gameAndNum" tells us whether we have an item with "game" and "choosenNum" properties matching the current iteration's item.
const gameAndNum = a.find(item => item.game == c.game && item.choosenNum == c.choosenNum);
// if yes, then we add increment the count property. Else, that means we're dealing with a new (game, choosenNum) pairs so we push the current iteration item to the reduced array.
gameAndNum ? gameAndNum.count = c.count : a.push(c);
// return the reduced array
return a;
}, []);
// print the result
console.log(merged);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/533207.html
下一篇:以指標作為引數傳遞一個雙精度陣列
