這是我的物件陣列:
const cart = [
{ group: "group 1", qtd: 12, value: 65, term: 20 }, //index 0
{ group: "group 1", qtd: 10, value: 100, term: 20 }, //index 1
{ group: "group 1", qtd: 18, value: 40, term: 10 }, //index 2
{ group: "group 2", qtd: 5, value: 30, term: 25 }, //index 3
{ group: "group 2", qtd: 22, value: 10, term: 25 }, //index 4
{ group: "group 3", qtd: 6, value: 60, term: 12 } //index 5
];
我需要做一些處理才能得到這個輸出:
result = [
{ group: "group 1", value: 1780, term: 20 },
{ group: "group 1", value: 720, term: 10 },
{ group: "group 2", value: 370, term: 25 },
{ group: "group 3", value: 360, term: 12 }
];
如果組相等 且術語也相等,我需要添加與此規則匹配的qtd和索引的值。在這個例子中,索引 0 和 1 與規則匹配,所以我使 (12 * 65) (10 * 100) = 1780 | 索引 3 和 4 也匹配,所以我使 (5 * 30) (22 * 10) = 370。如果條款不匹配,我就像在其他情況下一樣求和并分別顯示,就像在索引 2 和5.
首先,我試圖獲取這個物件的不同元素,以及它重復了多少次和多少次,所以我為此使用了 lodash:
const counts = _.countBy(cart, "group");
和輸出:
{ 'group 1': 3, 'group 2': 2, 'group 3': 1 }
從這個邏輯我想不出解決方案
我已經嘗試了很多邏輯,但我無處可去,如果有人能在這個邏輯上幫助我,我將不勝感激。
uj5u.com熱心網友回復:
您可以按想要的鍵分組,并取一個物件進行分組。結果取物件的值。
const
cart = [{ group: "group 1", qtd: 12, value: 65, term: 20 }, { group: "group 1", qtd: 10, value: 100, term: 20 }, { group: "group 1", qtd: 18, value: 40, term: 10 }, { group: "group 2", qtd: 5, value: 30, term: 25 }, { group: "group 2", qtd: 22, value: 10, term: 25 }, { group: "group 3", qtd: 6, value: 60, term: 12 }],
keys = ['group', 'term'],
result = Object.values(cart.reduce((r, { qtd, value, ...o }) => {
const key = keys.map(k => o[k]).join('|');
r[key] ??= { ...o, value: 0 };
r[key].value = qtd * value;
return r;
}, {}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
uj5u.com熱心網友回復:
這是一種方法。使用array.reduce作為迭代器,然后根據您的要求創建一種臨時 ID 進行跟蹤 - id 結合了組名和術語。因此,迭代器會記錄物件,{"group 1_20" : { ...data}這樣您就可以輕松找到一組匹配的值來將數字相加。最后,使用Object.values()洗掉那些臨時 ID 鍵
const cart = [
{ group: "group 1", qtd: 12, value: 65, term: 20 }, //index 0
{ group: "group 1", qtd: 10, value: 100, term: 20 }, //index 1
{ group: "group 1", qtd: 18, value: 40, term: 10 }, //index 2
{ group: "group 2", qtd: 5, value: 30, term: 25 }, //index 3
{ group: "group 2", qtd: 22, value: 10, term: 25 }, //index 4
{ group: "group 3", qtd: 6, value: 60, term: 12 } //index 5
];
const result = Object.values(cart.reduce((b, a) => {
let iden = a.group "_" a.term;
if (b[iden]) {
b[iden] = { ...b[iden],
value: b[iden].value (a.qtd * a.value)
}
} else {
a.value = a.qtd * a.value;
delete a.qtd;
b[iden] = a;
}
return b;
}, {}))
console.log(result)
uj5u.com熱心網友回復:
const cart = [
{ group: "group 1", qtd: 12, value: 65, term: 20 }, //index 0
{ group: "group 1", qtd: 10, value: 100, term: 20 }, //index 1
{ group: "group 1", qtd: 18, value: 40, term: 10 }, //index 2
{ group: "group 2", qtd: 5, value: 30, term: 25 }, //index 3
{ group: "group 2", qtd: 22, value: 10, term: 25 }, //index 4
{ group: "group 3", qtd: 6, value: 60, term: 12 } //index 5
];
const result = Object.values(cart.reduce((acc, el) => {
const key = el.group "_" el.term;
if (!acc[key]) acc[key] = {group: el.group, term: el.term, value: 0};
acc[key].value = el.qtd * el.value;
return acc;
}, {}));
console.log(result);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/506918.html
標籤:javascript 节点.js 数组 json 目的
