存在一個像這樣的物件陣列,其中有一個“類別”鍵和一些“系列”鍵。
arrOne = [
{
"series_1": 25,
"category": "Category 1",
"series_2": 50
},
{
"series_1": 11,
"category": "Category 2",
"series_2": 22
},
{
"series_1": 32,
"category": "Category 1",
"series_2": 74
},
{
"series_1": 74,
"category": "Category 3",
"series_2": 98
},
{
"series_1": 46,
"category": "Category 3",
"series_2": 29
},
]
(請注意,“類別”幾乎可以是任何值,盡管可能會有多個相似的值以及一些獨特的值,例如,有多個物件的“類別”值為“類別 3”,但只有 1 個具有“類別”的值“類別 2')
以下代碼行將所有 series_1 的同類別物件相加
var objForAllCategories = {};
this.arrOne.forEach(item => {
if (objForAllCategories.hasOwnProperty(item.category))
objForAllCategories[item.category] = objForAllCategories[item.category] item.series_1;
else
objForAllCategories[item.category] = item.series_1;
});
for (var prop in objForAllCategories) {
this.allCategoriesAndValues.push({
category: prop,
series_1: objForAllCategories[prop]
});
}
所以會導致:
allCategoriesAndValues = [
{
"category": "Category 1",
"series_1": 57 // 25 32 adding up series_1 from all 'Category 1' items in arrOne
},
{
"category": "Category 2",
"series_1": 11 // only 1 'Category 2' from arrOne
},
{
"category": "Category 3",
"series_1": 120 // 74 46 adding up series_1 from all 'Category 3' items in arrOne
}
]
但是,我不僅希望能夠添加 series_1,還希望能夠添加所有其他專案。
這個例子只有 category 和 series_1 和 series_2 作為鍵。但是,可能有:
- 系列_3
- 系列_4
- 系列_5
- 系列_6
- 系列_7
- 等等..
我如何考慮所有潛在的 series_x?
預期結果:
allCategoriesAndValues = [
{
"category": "Category 1",
"series_1": 57,
"series_2": 124,
..... if 'series_3', 'series_4' etc. existed, it would be included in this as above
},
{
"category": "Category 2",
"series_1": 11,
"series_2": 22,
..... if 'series_3', 'series_4' etc. existed, it would be included in this as above
},
{
"category": "Category 3",
"series_1": 120,
"series_2": 127,
..... if 'series_3', 'series_4' etc. existed, it would be included in this as above
}
]
uj5u.com熱心網友回復:
要處理多個屬性邏輯,您可以遍歷每個屬性并檢查它是否與 regex 匹配series_\d 。如果是,您就知道這是一個需要遞增的屬性,并相應地處理它(如Jayce444所指出的,還需要進行屬性是否存在檢查)。
以下解決方案使用Array.reduce. 在reducer 函式中,它檢查累加器陣列是否包含與category當前回圈的專案具有相同屬性的專案。如果是,它將增加適當的屬性。否則,它會將當前項推送到累加器陣列。
arrOne=[{series_1:25,category:"Category 1",series_2:50},{series_1:11,category:"Category 2",series_2:22},{series_1:32,category:"Category 1",series_2:74},{series_1:74,category:"Category 3",series_2:98},{series_1:46,category:"Category 3",series_2:29,series_3:50}];
const res = arrOne.reduce((a, b) => {
let found = a.find(e => e.category == b.category)
if (found) {
Object.keys(b).forEach(e => {
if (/series_\d /g.test(e)) found[e] = found[e] ? found[e] b[e] : b[e];
})
} else {
a.push(b)
}
return a;
}, [])
console.log(res)
uj5u.com熱心網友回復:
像這樣的東西可以作業。
arrOne = [ { "series_1": 25, "category": "Category 1", "series_2": 50 }, { "series_1": 11, "category": "Category 2", "series_2": 22 }, { "series_1": 32, "category": "Category 1", "series_2": 74 }, { "series_1": 74, "category": "Category 3", "series_2": 98 }, { "series_1": 46, "category": "Category 3", "series_2": 29 },];
const result = [];
arrOne.reduce((acc, {category, ...series}) => {
if (acc.has(category)) {
Object.entries(series).forEach(([key, value]) => {
if (key.startsWith('series_')) {
acc.get(category)[key] = (acc.get(category)[key] || 0) value;
}
});
} else {
const item = {category, ...series};
result.push(item);
acc.set(category, item);
}
return acc;
}, new Map());
console.log(result);
uj5u.com熱心網友回復:
創建一個 Map 以按類別整理系列總和。
然后從該映射創建一個陣列,鍵為 category
const arr1 = [{"series_1":25,"category":"Category 1","series_2":50},{"series_1":11,"category":"Category 2","series_2":22},{"series_1":32,"category":"Category 1","series_2":74},{"series_1":74,"category":"Category 3","series_2":98},{"series_1":46,"category":"Category 3","series_2":29}]
const t1 = performance.now()
const cats = arr1.reduce((map, { category, ...series }) =>
map.set(category, Object.entries(series)
.reduce((s, [ key, count ]) => ({
...s,
[ key ]: (s[key] ?? 0) count
}), map.get(category) ?? {})
), new Map())
const allCategoriesAndValues = Array.from(cats, ([ category, series ]) => ({
category,
...series
}))
const t2 = performance.now()
console.info(allCategoriesAndValues)
console.log(`Took ${t2 - t1}ms`)
.as-console-wrapper { max-height: 100% !important; }
uj5u.com熱心網友回復:
我會這樣做...
const arrOne =
[ { series_1: 25, category: 'Category 1', series_2: 50 }
, { series_1: 11, category: 'Category 2', series_2: 22 }
, { series_1: 32, category: 'Category 1', series_2: 74 }
, { series_1: 74, category: 'Category 3', series_2: 98 }
, { series_1: 46, category: 'Category 3', series_2: 29 }
]
console.time('chrono')
const allCategoriesAndValues =
Object.entries(
arrOne.reduce((r,{ category, ...series })=>
{
let cat = r[category] = r[category] ?? {}
Object.entries(series).forEach(([sName,val]) => cat[sName] = (cat[sName] ?? 0) val);
return r
},{})
).map(([category,series])=>({category,...series}))
console.timeEnd('chrono')
console.log( allCategoriesAndValues )
.as-console-wrapper {max-height: 100%!important;top:0 }
uj5u.com熱心網友回復:
您可以遍歷物件陣列,然后遍歷每個物件的鍵,將其存盤到緩沖區物件中。您只需要檢查每個鍵是否存在并在缺少時添加它,或者您可以像我一樣將虛假鍵合并為默認值。我在獲得它的值后從物件中洗掉類別鍵,這樣我就不必在鍵迭代期間嘗試跳過它。
const arrOne = [
{"series_1": 25, "category": "Category 1", "series_2": 50},
{"series_1": 11, "category": "Category 2", "series_2": 22},
{"series_1": 32, "category": "Category 1", "series_2": 74},
{"series_1": 74, "category": "Category 3", "series_2": 98},
{"series_1": 46, "category": "Category 3", "series_2": 29},
];
let buffer = {};
arrOne.forEach(i=>{
let c = i.category;
buffer[c] = buffer[c] || {};
delete i.category;
Object.keys(i).forEach(k=>{
buffer[c][k] = buffer[c][k] || 0;
buffer[c][k] = i[k];
});
});
console.log(buffer);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/364440.html
標籤:javascript 数组 json 核心价值
