簡體   English   中英

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)
  1. 按自定義鍵分組,例如Date_Available + Country
  2. 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
  }
]

您可以為此使用reduceObject.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM