【问题标题】:JS reduce list based on one of its propertiesJS 根据其属性之一减少列表
【发布时间】:2019-06-18 12:18:37
【问题描述】:

我正在用 react js 编写一个方法,比如说我有一个如下所示的列表。

const itemList = [
    {
        "id": 3295042,
        "tillPoint": "A",
        "date": "23/01/2019",
        "AnnaIncome": 100,
        "PeterIncome": 50,
        "KenIncome": 100,
        "freeCash": 30
    },
    {
        "id": 3295042,
        "tillPoint": "B",
        "date": "23/01/2019",
        "AnnaIncome": 300,
        "PeterIncome": 200,
        "KenIncome": 100,
        "freeCash": 50
    },
    {
        "id": 3295042,
        "tillPoint": "A",
        "date": "22/01/2019",
        "AnnaIncome": 120,
        "PeterIncome": 120,
        "KenIncome": 30,
        "freeCash": 50
    },
    {
        "id": 3295042,
        "tillPoint": "B",
        "date": "22/01/2019",
        "AnnaIncome": 100,
        "PeterIncome": 150,
        "KenIncome": 50,
        "freeCash": 60
    },
] 

我希望做一个.reduce 以使列表仅按日期属性包含更少的项目。 例如,在上面的列表中,实际上只有两个日期 22/01/2019 和 23/01/2019。 我希望按每个对象的日期减少列表的大小。所以每个人的收入都会以自己的名义加起来。 最终,列表将变成只有 2 个对象。并且在新列表中删除了一些属性 例如下面,'id' 和 'tillpoint' 被删除,其余属性加在一起:

let itemList = [
    {
        "date": "23/01/2019",
        "AnnaIncome": 300,
        "PeterIncome": 250,
        "KenIncome": 200,
        "freeCash": 80
    },
    {
        "date": "22/01/2019",
        "AnnaIncome": 220,
        "PeterIncome": 280,
        "KenIncome": 80,
        "freeCash": 110
    }
]

我在这里尝试过的内容如下所示,但它不起作用。

itemList.reduce((a, b) => ({ date: a.AnnaIncome + b.AnnaIncome, a.PeterIncome + b.PeterIncome, a.KenIncome + b.KenIncome, a.freeCash + b.freeCash }));

【问题讨论】:

    标签: javascript arrays reactjs list reduce


    【解决方案1】:

    您必须按日期分组,这可以使用哈希表轻松完成:

     const byDate = new Map;
    
     for(const { date, id, tillPoint, ...rest } of itemList) {
       if(byDate.has(date)) {
         const dupe = byDate.get(date);
         for(const [k, v] of Object.entries(rest))
           dupe[k] += v;
       } else {
         byDate.set(date, { date, ...rest });
       }
    }
    
    const result = [...byDate.values()];
    

    如果性能如此重要,您可以轻松地将添加的内容硬编码为dupe.something += rest.something

    【讨论】:

      【解决方案2】:

      您可以使用reducespread 运算符。

      所以在这里我正在做的是我正在获取您想要直接添加到您的输出中的动态属性,而无需在 ...rest 中进行任何操作,剩下的我正在取出各自的名称。

      然后我检查数据键是否已经存在,我添加...rest 并将freeCash 添加到现有值。如果不存在,我们将创建一个带有日期和相应值的新键。

      const itemList = [{"id":3295042,"tillPoint":"A","date":"23/01/2019","AnnaIncome":100,"PeterIncome":50,"KenIncom":100,"freeCash":30},{"id":3295042,"tillPoint":"B","date":"23/01/2019","AnnaIncome":300,"PeterIncome":200,"KenIncom":100,"freeCash":50},{"id":3295042,"tillPoint":"A","date":"22/01/2019","AnnaIncome":120,"PeterIncome":120,"KenIncom":30,"freeCash":50},{"id":3295042,"tillPoint":"B","date":"22/01/2019","AnnaIncome":100,"PeterIncome":150,"KenIncom":50,"freeCash":60},]
      
      const op = itemList.reduce((output,current)=>{
        let {id,tillPoint,date,freeCash,...rest} = current
       
        if(output[date]){
          output[date] = {
            ...output[date],
            ...rest,
            date,
            freeCash: output[date].freeCash +freeCash
          }
        } else {
          output[date] ={
            ...rest,
            date,
            freeCash
          }
        }
        return output
      },{})
      
      console.log(Object.values(op))

      【讨论】:

      • 好奇投反对票的目的是什么,对我来说似乎是一个合理的答案,证明了 reduce 的使用。
      【解决方案3】:

      可能是这样的:

      const itemList = [
          { "id": 3295042, "tillPoint": "A", "date": "23/01/2019", "AnnaIncome": 100, "PeterIncome": 50,  "KenIncome": 100, "freeCash": 30 },
          { "id": 3295042, "tillPoint": "B", "date": "23/01/2019", "AnnaIncome": 300, "PeterIncome": 200, "KenIncome": 100, "freeCash": 50 },
          { "id": 3295042, "tillPoint": "A", "date": "22/01/2019", "AnnaIncome": 120, "PeterIncome": 120, "KenIncome": 30,  "freeCash": 50 },
          { "id": 3295042, "tillPoint": "B", "date": "22/01/2019", "AnnaIncome": 100, "PeterIncome": 150, "KenIncome": 50,  "freeCash": 60 },
      ];
      
      
      var new_itemList=[];
      
      for(var key in itemList){
      	var new_key = -1;
      	for(var keyn in new_itemList){
      	   if(new_itemList[keyn].date == itemList[key].date){
      	   	  new_key = parseInt(keyn, 10);
      	   }
      	}
      	if(new_key == -1){
      		new_itemList.push({'date':itemList[key].date, 'AnnaIncome': itemList[key].AnnaIncome, 'PeterIncome': itemList[key].PeterIncome, 'KenIncome': itemList[key].KenIncome, 'freeCash': itemList[key].freeCash});
      	}else{
             new_itemList[new_key].AnnaIncome +=  itemList[key].AnnaIncome;
             new_itemList[new_key].PeterIncome +=  itemList[key].PeterIncome;
             new_itemList[new_key].KenIncome +=  itemList[key].KenIncome;
             new_itemList[new_key].freeCash +=  itemList[key].freeCash;
      	}
      }
      console.log(new_itemList);

      【讨论】:

        猜你喜欢
        • 2013-03-01
        • 2018-04-15
        • 2015-11-30
        • 1970-01-01
        • 1970-01-01
        • 2012-10-10
        • 1970-01-01
        • 2022-08-06
        • 1970-01-01
        相关资源
        最近更新 更多