首页 > 解决方案 > 合并重复并增加数组javascript中每个对象的计数

问题描述

我有一个这样的数组:

const studentList = [{code: "AA", gender:"male", DOB:"2000-05-15"},
{code: "AA", gender:"female", DOB:"2015-05-15"},
{code:"A0", gender:"female", DOB:"2005-01-01"},
{code: "A1", gender:"male", DOB:"2015-01-15"}]

我想要的结果是:孩子确定:Date.now().getFUllYear() - DOB.getFullYear() < 18 年

[{code:"AA", count:2, female: 1, child: 1},
{code:"A0", count: 1, female: 1, child: 1},
{code: "A1", count: 1, female: 0, child: 1}]

到目前为止,我已经做了这样的事情:

const result = new Map();
studentList.map(e =>{
    const isFemale = e.gender === "female";
    const isChild = nowYear - e.DOB.getYear() < 18;
    if(result.has(e.code) && isChild && isFemale){
       result.get(e.code).count++;
       result.get(e.code).female++;
       result.get(e.code).child++;
    }else if(!result.get(e.code && !isFemale && !isChild) {
       result.set(e.code, Object.assign(e,{count: 1, female: 0; child: 0 }))
    }
....
})

因此,对于每个条件,我都必须在 IF ELSE 中添加一个语句,所以我想知道是否有任何更短的方法可以在不使用太多 if else 的情况下做到这一点

标签: javascriptnode.jsarrayssortingobject

解决方案


利用加号运算符 (+) 将布尔值true和分别转换false为数字1和的功能0,并使用OR(||) 运算符根据条件分配两个值之一,您可以将代码简化为:

const studentList = [
{code: "AA", gender:"male", DOB:"2000-05-15"},
{code: "AA", gender:"female", DOB:"2015-05-15"},
{code:"A0", gender:"female", DOB:"2005-01-01"},
{code: "A1", gender:"male", DOB:"2015-01-15"}
];



const result = new Map();
var nowYear = new Date().getYear();

studentList.forEach(e =>{
    var item = result.get(e.code) || {code: e.code, count: 0, female: 0, child: 0 };
    item.count++;
    item.female += e.gender === "female";
    item.child += nowYear - new Date(Date.parse(e.DOB)).getYear() < 18;
    result.set(item.code, item);
})
 
for ([key, value] of result.entries()) {
  console.log(value);
}


推荐阅读