Javascript 遍历对象数组并输出自定义对象

Javascript 遍历对象数组并输出自定义对象,javascript,arrays,data-structures,mapping,reduce,Javascript,Arrays,Data Structures,Mapping,Reduce,我需要从Typescript中的对象数组构建一个自定义对象 在下面的示例中,我如何计算销售人员名称在数组中的次数,为每个销售人员名称加总次数,如果每个销售人员名称的保修不为空,如何计算?因此,如果我有: [ {salesman_1_name:Brian, gross:100, warranty: Easycare}, {salesman_1_name:Brian, gross:100, warranty: Easycare}, {salesman_1_name:Brian

我需要从Typescript中的对象数组构建一个自定义对象

在下面的示例中,我如何计算销售人员名称在数组中的次数,为每个销售人员名称加总次数,如果每个销售人员名称的保修不为空,如何计算?因此,如果我有:

[
    {salesman_1_name:Brian, gross:100, warranty: Easycare},
    {salesman_1_name:Brian, gross:100, warranty: Easycare},
    {salesman_1_name:Brian, gross:100, warranty: null},
    {salesman_1_name:Kreso, gross:100, warranty: null},
    {salesman_1_name:Filip, gross:100, warranty: Easycare}
]
我需要输出:

[
    Name:Brian, Count:3, Gross:300, WarrantyCount:2, 
    Name:Kreso, Count:1, Gross:100, WarrantyCount:0, 
    Name:Filip, Count:1, Gross:100, WarrantyCount:1
]

您可以使用对象作为具有名称的组的引用,并进行聚合

var data=[{sales_1_name:'Brian',gross:100,保修期:'Easycare'},{sales_1_name:'Brian',gross:100,保修期:null},{sales_1_name:'Kreso',gross:100,保修期:null},{sales_1_name:'Filip',gross:100,保修期:'Easycare'},
分组=[];
data.forEach(函数(a){
如果(!这个[a.推销员的名字]){
这个[a.saller\u 1\u name]={name:a.saller\u 1\u name,计数:0,总值:0,担保计数:0};
分组。推送(此[a.sallers_1_name]);
}
这是[a.sallers_1_name].Count++;
此[a.saller\u 1\u name].Gross+=a.Gross;
a、 保修!==null&&this[a.sales\u 1\u name].WarrantyCount++;
},Object.create(null));
控制台日志(分组)
.as控制台包装{最大高度:100%!重要;顶部:0;}
//代码在这里
风险值数据=[{
推销员的名字:“布赖恩”,
毛额:100,
保修:“Easycare”
}, {
销售员\u 1\u name:'Brian',
毛额:100,
保修:“Easycare”
}, {
推销员的名字:“布赖恩”,
毛额:100,
保修:无效
}, {
推销员的名字:“克雷索”,
毛额:100,
保修:无效
}, {
推销员的名字:“菲利普”,
毛额:100,
保修:“Easycare”
}];
变量结果=(函数(myArray){
var obj=[];//也可以用于Object.values(dataCollector)
var dataCollector=myArray.reduce(函数(dataCollector,currentItem){
如果(!dataCollector[currentItem['sallers\u 1\u name']]{
数据采集器[currentItem['sallers\u 1\u name']={
名称:currentItem.sallers\u 1\u名称,
计数:0,
总额:当前项目。总额,
保修计数:currentItem['Salesian\u 1\u name']。保修!=null?0:1
};
}否则{
数据采集器[currentItem['sallers_1_name']]。计数++;
数据采集器[currentItem['sallers_1_name'].Gross+=currentItem.Gross;
如果(当前项['sallers\u 1\u name'],保修!==null){
数据采集器[currentItem['sallers_1_name']]。保修计数++;
}
}
返回数据采集器;
}, {});
for(dataCollector中的var键){
if(dataCollector.hasOwnProperty(键)){
对象推送(数据采集器[键]);
}
}
返回obj;
})(数据)
控制台日志(结果)
var rawSalesmanData=[
{销售人员姓名:“布赖恩”,毛额:100,保修期:“Easycare”},
{销售人员姓名:“布赖恩”,毛额:100,保修期:“Easycare”},
{销售人员姓名:“布赖恩”,毛额:100,保修期:空},
{销售人员姓名:“Kreso”,毛额:100,保修期:空},
{销售人员姓名:“菲利普”,毛额:100,保修期:“Easycare”}
];
var salesmansspecificlist=rawSalesmanData.reduce(函数(收集器,rawDataItem/*,idx,rawDataList*/){
var-map=collector.map;
var key=rawDataItem.saller\u 1\u name;
var namedItem=map[key];
如果(!namedItem){
namedItem=映射[键]={
姓名:key,,
发生次数计数:0,
格罗斯托尔:0,
担保金额:0
};
收集器.list.push(namedItem);
}
namedItem.occurrencyCount++;
namedItem.grossTotal=(namedItem.grossTotal+rawDataItem.gross);
namedItem.warrantyCount=(namedItem.warrantyCount+((rawDataItem.warranty!==null)?1:0);
回程收集器;
}, {
映射:{},
名单:[]
}).名单;

log(“salesmanSpecificList:”,salesmanSpecificList)是一个字符串吗?您从何处获得
WarrantyCount
是的,我的意思是在示例中的两行“Brian”中添加保修名称。如果保修不为空,我需要计数,计数++为什么您会得到
Filip。。。保修金额:1
Brian。。。保修计数:2
?经过编辑,我在示例中保留了不在保修范围内的字符串。我刚刚编辑过。在
reduce
的每个迭代步骤中,一个人确实不想要,也不需要在累积列表中搜索相关的销售人员项目。@Vladulonut。。。嗯。。。两个退出点—
返回obj
返回数据采集器
——以及提前退出的最终条件,需要在每次迭代
reduce
时进行处理
reduce
及其累加器对象真的可以更优雅地使用。。。还有最后一个条件,我们不需要引用外部列表,因为它是作为
reduce
回调函数的第四个参数提供的,因此可以从回调函数内部引用简化的列表,并处理尚未命名的数组。1/2:我非常喜欢您的方法,但这次我会挑剔<代码>减少
应该是首选方法。这有两个论点。该方法使用和附加的目标对象(为什么
object.create(null)
而不是普通对象literal
{}
)作为映射或累加器对象,需要将其称为
this
(对于许多人来说,这种用法/目的即使在第二眼也不太明显)…2/2:。。。另一方面,代码仍然需要粘贴到
分组的
外部对象作为最终累加器对象。使用
reduce
可以免费获取所有内容,回调代码变得更优雅,可重用性更强。如果我有一个类似
toString
的散列,那么检查是否存在会导致错误的结果。我使用forEach,因为reduce的性质,在这个例子中,reduce始终是相同的,它是对结果集的引用,而不是rea
data.reduce((acc, cur) => {
  const obj = acc.find(x => x.Name === cur.salesman_1_name);
  if (obj) {
    obj.Gross += cur.gross;
    obj.WarrantyCount = cur.warranty !== null ? obj.WarrantyCount + 1 : obj.WarrantyCount;
  } else {
    acc.push({ Name: cur.salesman_1_name, Gross: cur.gross, WarrantyCount: cur.warranty !== null ? 1 : 0 });
  }
  return acc;
}, []);