4 回答

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超16個(gè)贊
就像您提到的那樣,我們可以使用對(duì)象而不是數(shù)組作為最外層的包裝器。并且還將一個(gè)對(duì)象內(nèi)部交換為數(shù)組,那么這是一種可能的解決方案。
var data = [{"name": "JOHN","type": 1,"sum": 5},{"name": "SERA","type": 1,"sum": 43},{"name": "SERA","type": 2,"sum": 129},{"name": "JOHN","type": 2,"sum": 200}];
var newData = {};
data.forEach( (item) => {
if (!(item['name'] in newData)) {
newData[item['name']] = [];
}
newData[item['name']].push(
{
'type': item['type'],
'sum' : item['sum']
}
);
});
console.log(newData);

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊
您建議的輸出結(jié)構(gòu)無(wú)效,但是使用Array.reduce
您可以創(chuàng)建一個(gè)對(duì)象,其中所有屬性都是對(duì)象數(shù)組:
const data = [
? ? {
? ? ? ? "name": "JOHN",
? ? ? ? "type": 1,
? ? ? ? "sum": 5
? ? },
? ? {
? ? ? ? "name": "SERA",
? ? ? ? "type": 1,
? ? ? ? "sum": 43
? ? },
? ? {
? ? ? ? "name": "SERA",
? ? ? ? "type": 2,
? ? ? ? "sum": 129
? ? },
? ? {
? ? ? ? "name": "JOHN",
? ? ? ? "type": 2,
? ? ? ? "sum": 200
? ? }
];
const result = data.reduce((c, {name, type, sum}) => {
? c[name] = c[name] || [];
? c[name].push({type, sum});
? return c;
}, {});
console.log(result);

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊
forEach使用,destructuring和??運(yùn)算符的另一種方式
const merge = (arr) => {
const obj = {};
arr.forEach(({ name, ...rest }) => (obj[name] ??= []).push(rest));
return obj;
};
const data = [
{
name: "JOHN",
type: 1,
sum: 5,
},
{
name: "SERA",
type: 1,
sum: 43,
},
{
name: "SERA",
type: 2,
sum: 129,
},
{
name: "JOHN",
type: 2,
sum: 200,
},
];
console.log(merge(data));

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個(gè)贊
您可以使用此函數(shù)將 Array.prototype.reduce初始數(shù)據(jù)轉(zhuǎn)換為另一種數(shù)組結(jié)構(gòu)。
let data = [
{
"name": "JOHN",
"type": 1,
"sum": 5
},
{
"name": "SERA",
"type": 1,
"sum": 43
},
{
"name": "SERA",
"type": 2,
"sum": 129
},
{
"name": "JOHN",
"type": 2,
"sum": 200
}
];
function groupedBy(data, field) {
let fieldValues = [...data].reduce((acc, current) => {
return acc.concat(current[field]);
}, []).filter((value, index, self) => {
return self.indexOf(value) === index;
});
let results = fieldValues.reduce((acc, item) => {
let items = [...data].filter(el => {
return el.name === item;
});
items.forEach(i => delete i.name);
return Object.assign(acc, { [item]: items});
}, {});
return results;
}
console.log(groupedBy(data, "name"));
添加回答
舉報(bào)