[英]Count number of items in an array of objects with a specific property value (JavaScript)
[英]JavaScript count number of ocurrences in Array of Objects
我有一個對象數組,我試圖弄清楚如何創建一個新的對象數組,該數組將顯示一個新的對象數組,但帶有一個“出現”字段。
這是我開始的 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)
Date_Available + Country
reduce()
結果,創建一個以第一個 object 為基數的數組,然后根據找到的對象數量 ( .length
) 添加Ocurrences
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
}
]
您可以為此使用reduce
和Object.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'))
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 });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.