我有一個物件陣列,我試圖弄清楚如何創建一個新的物件陣列,該陣列將顯示一個新的物件陣列,但帶有一個“出現”欄位。
這是我的起始 json 物件陣列:
const fakeJson = [
{
"Id": 1,
"Name": "John",
"Age": 32,
"Date_Available": "2022-04-10",
"Popularity": 99,
"Country": "Canada"
},
{
"Id": 1,
"Name": "John",
"Age": 32,
"Date_Available": "2022-04-11",
"Popularity": 99,
"Country": "Canada"
},
{
"Id": 1,
"Name": "John",
"Age": 32,
"Date_Available": "2022-04-12",
"Popularity": 99,
"Country": "Canada"
},
{
"Id": 1,
"Name": "John",
"Age": 32,
"Date_Available": "2022-04-12",
"Popularity": 99,
"Country": "China"
},
{
"Id": 1,
"Name": "John",
"Age": 32,
"Date_Available": "2022-04-12",
"Popularity": 99,
"Country": "Canada"
}
我想要的示例結果。請注意加拿大國家/地區的 Occurences: 2 for Date_Available "2022-04-12"。我怎么能做到這一點?
const resultJSON = [
{
"Date_Available": "2022-04-10",
"Popularity": 99,
"Country": "Canada",
"Occurrences" : 1
},
{
"Date_Available": "2022-04-11",
"Popularity": 99,
"Country": "Canada",
"Ocurrences" : 1
},
{
"Date_Available": "2022-04-12",
"Popularity": 99,
"Country": "Canada",
"Occurrences" : 2
},
{
"Date_Available": "2022-04-12",
"Popularity": 99,
"Country": "China",
"Occurrences" : 1
}
這是我到目前為止所擁有的。我的想法是創建一個臨時 obj,其國家名稱、可用日期和發生設定默認為 1。然后基于 Date_Available,每次出現時增加 1。但是,如果中國和加拿大的日期相同,那么它似乎會混淆代碼并且無法正確列印結果。
let countNameMapping = {};
let finalArr = [];
for(let i = 0; i < fakeJson.length; i ){
let tempObj = {Country:fakeJson[i].Country, Date_Available: fakeJson[i].Date_Available, occurence: 1};
let countryName = fakeJson[i].Country;
let date = fakeJson[i].Date_Available;
if(countNameMapping[date] === undefined){
countNameMapping[countryName] = tempObj;
} else {
countNameMapping[date].occurence = 1;
}
}
for(let k in countNameMapping){
finalArr.push(countNameMapping[k])
}
console.log(finalArr)
uj5u.com熱心網友回復:
- 按自定義鍵分組,例如
Date_Available Country
reduce()
結果,創建一個以第一個物件為基礎的陣列,然后Ocurrences
根據找到的物件數量添加 (.length
)
const data = [{"Id": 1, "Name": "John", "Age": 32, "Date_Available": "2022-04-10", "Popularity": 99, "Country": "Canada"}, {"Id": 1, "Name": "John", "Age": 32, "Date_Available": "2022-04-11", "Popularity": 99, "Country": "Canada"}, {"Id": 1, "Name": "John", "Age": 32, "Date_Available": "2022-04-12", "Popularity": 99, "Country": "Canada"}, {"Id": 1, "Name": "John", "Age": 32, "Date_Available": "2022-04-12", "Popularity": 99, "Country": "China"}, {"Id": 1, "Name": "John", "Age": 32, "Date_Available": "2022-04-12", "Popularity": 99, "Country": "Canada"}];
const grouped = data.reduce((p, c) => {
const key = c.Date_Available c.Country;
(p[key] = p[key] || []).push(c);
return p;
}, {});
const result = Object.values(grouped).reduce((p, c) => [ ...p, { ...c[0], Ocurrences: c.length } ], []);
console.log(result)
結果:
[
{
"Id": 1,
"Name": "John",
"Age": 32,
"Date_Available": "2022-04-10",
"Popularity": 99,
"Country": "Canada",
"Ocurrences": 1
},
{
"Id": 1,
"Name": "John",
"Age": 32,
"Date_Available": "2022-04-11",
"Popularity": 99,
"Country": "Canada",
"Ocurrences": 1
},
{
"Id": 1,
"Name": "John",
"Age": 32,
"Date_Available": "2022-04-12",
"Popularity": 99,
"Country": "Canada",
"Ocurrences": 2
},
{
"Id": 1,
"Name": "John",
"Age": 32,
"Date_Available": "2022-04-12",
"Popularity": 99,
"Country": "China",
"Ocurrences": 1
}
]
uj5u.com熱心網友回復:
你可以使用reduce
andObject.values
為此
像這樣
const groupBy = (data, ...keyGroup) => Object.values(data.reduce((res, item) => {
const key = keyGroup.map(k => item[k]).join('-')
const existing = res[key] || {...item, occurencies: 0}
return {
...res,
[key]: {...existing,occurencies: existing.occurencies 1 }
}
}, {}))
const fakeJson = [
{
"Id": 1,
"Name": "John",
"Age": 32,
"Date_Available": "2022-04-10",
"Popularity": 99,
"Country": "Canada"
},
{
"Id": 1,
"Name": "John",
"Age": 32,
"Date_Available": "2022-04-11",
"Popularity": 99,
"Country": "Canada"
},
{
"Id": 1,
"Name": "John",
"Age": 32,
"Date_Available": "2022-04-12",
"Popularity": 99,
"Country": "Canada"
},
{
"Id": 1,
"Name": "John",
"Age": 32,
"Date_Available": "2022-04-12",
"Popularity": 99,
"Country": "China"
},
{
"Id": 1,
"Name": "John",
"Age": 32,
"Date_Available": "2022-04-12",
"Popularity": 99,
"Country": "Canada"
}
]
console.log('by ID', groupBy(fakeJson, 'Id'))
console.log('by Country', groupBy(fakeJson, 'Country'))
console.log('by country and date', groupBy( fakeJson, 'Country', 'Date_Available'))
uj5u.com熱心網友回復:
const json = fakeJson.reduce((prev, curr) => {
const check = () => prev.findIndex(({ Date_Available, Country }) =>
curr.Date_Available === Date_Available &&
curr.Country === Country
);
if (
!prev.length ||
check() === -1
) prev.push({
...Object.fromEntries(
Object.entries(curr).filter(([key]) => !key.match(/id|name|age/i))
),
Occurences: 1
})
else prev[check()].Occurences
return prev
}, [])
console.log({ json });
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/503784.html
標籤:javascript 数组 循环 目的 javascript 对象
上一篇:不支持的協議ASP.NET