如何使用 javascripts 对具有相同键的对象数组进行分组?

How to Group array of objects with same keys using javascripts?

我想制作一个按日期 属性 分组的对象数组。

let data = [
        { Age: "(60-100)", Date: "28/05/20" },
        { Age: "(60-100)", Date: "28/05/20" },
        { Age: "(4-6)", Date: "28/05/20" },
        { Age: "(60-100)", Date: "29/05/20" },
        { Age: "(38-43)", Date: "29/05/20" },
        { Age: "(4-6)", Date: "29/05/20" },
        { Age: "(38-43)", Date: "30/05/20" },
        { Age: "(38-43)", Date: "30/05/20" }
    ];

我想要这样的输出

 result = [
        { Date: "28/05/20", "(60-100)": 2, "(4-6)": 1 },
        { Date: "29/05/20", "(38-43)": 1, "(4-6)": 1, "(60-100)": 1 },
        { Date: "30/05/20", "(38-43)": 2 },
    ]

试试这个:

var result={};
for(var item of data) {
  if(result[item.Date]==undefined) result[item.Date]={};
  if(result[item.Date][item.Age]==undefined) result[item.Date][item.Age]=0;
  result[item.Date][item.Age]++;
}

这为您提供了一个对象(不是数组),其中键为 Date,值为对象,键为 Age,值为计数。
如果你还需要一个数组,你可以遍历结果并构造一个数组。

result=={
  "28/05/20": {
    "(60-100)": 2,
    "(4-6)": 1
  },
  "29/05/20": {
    "(60-100)": 1,
    "(38-43)": 1,
    "(4-6)": 1
  },
  "30/05/20": {
    "(38-43)": 2
  }
}

如果你想要数组,你可以创建resultArr=[],遍历结果的键,tempObj,添加键“Date”和迭代键的值,然后遍历迭代键的键,添加每个“年龄”及其计数,然后将 tempObj 推入 resultArr...

试试这个。

 let data = [
      { Age: "(60-100)", Date: "28/05/20" },
      { Age: "(60-100)", Date: "28/05/20" },
      { Age: "(4-6)", Date: "28/05/20" },
      { Age: "(60-100)", Date: "29/05/20" },
      { Age: "(38-43)", Date: "29/05/20" },
      { Age: "(4-6)", Date: "29/05/20" },
      { Age: "(38-43)", Date: "30/05/20" },
      { Age: "(38-43)", Date: "30/05/20" }
 ];
    
 let res = [];
 data.map((d, index) => {
      if (!res.some(val => val.Date === d.Date)) {
           d[`${d.Age}`] = 1
           res.push(d)
           delete(d.Age)
      } else {
           let index = res.findIndex(val => val.Date == d.Date);
           let _d = res[index];
           if (_d.hasOwnProperty(`${d.Age}`)) {
                _d[`${d.Age}`] = parseInt(_d[`${d.Age}`] + 1)
           } else {
                _d[`${d.Age}`] = 1
           }
           res[index] = _d;
      }
 })
 
 console.log(res)

试试这个:

function groupByDate(data){
    let groupedData = [];
    data.forEach(element => {
        //Search for the object containing the specified date
        let objIndex = groupedData.findIndex(object => {return object.Date == element.Date;})
        //If date is not created, create it
        if (objIndex == -1){
            groupedData.unshift({Date: element.Date})
            objIndex = 0;
        }
        //If age is not created, create it. Else add 1 to specified age.
        if(typeof groupedData[objIndex][element.Age] == 'undefined'){
            groupedData[objIndex][element.Age] = 1;
        } else {
            groupedData[objIndex][element.Age]++;
        }
    });
    return groupedData;
}

如果您还想按日期排序,可以查看 this post。 希望对你有帮助!

基于@Dante Culaciati 方法的精简版,带有可选的排序参数。

const condenseAge = (arr, isSort = true) => {
    let r = [];
    arr.map((val) => {
        let i = r.findIndex(obj => obj.Date == val.Date);
        (i < 0) && r.unshift({Date: val.Date}) && (i = 0);
        (!r[i][val.Age]) ? r[i][val.Age] = 1 : r[i][val.Age]++;
    });
    return !isSort?r:r.sort((a,b)=>(ac=a['Date'].split('/'), bc=b['Date'].split('/'), new Date(ac[2],ac[1],ac[0]) - new Date(bc[2],bc[1],bc[0])));
}
console.log(condenseAge([
    { Age: "(4-6)", Date: "02/06/20"},
    { Age: "(60-100)", Date: "28/05/20" },
    { Age: "(60-100)", Date: "28/05/20" },
    { Age: "(4-6)", Date: "28/05/20" },
    { Age: "(60-100)", Date: "29/05/20" },
    { Age: "(38-43)", Date: "29/05/20" },
    { Age: "(4-6)", Date: "29/05/20" },
    { Age: "(38-43)", Date: "30/05/20" },
    { Age: "(38-43)", Date: "30/05/20" }
]));