连接、分组和计算两个javascript对象

连接、分组和计算两个javascript对象,javascript,Javascript,我尝试得到一个对象,如: var result = [{ "surveyCode":"C", "count": 1}, {"surveyCode":"A", count: 4}] 通过连接surveyCode上的两个对象,并计算对象a中每个选定surveyCode的项目数 合并后,我也无法链接地图。有什么想法吗 我的尝试是: var a=[{“id”:319268,“surveyCode”:“a”,“field3”:4}, {“id”:319269,“调查代码”:“A”,“字段3”:4},

我尝试得到一个对象,如:

var result = [{ "surveyCode":"C", "count": 1}, {"surveyCode":"A", count: 4}]
通过连接surveyCode上的两个对象,并计算对象a中每个选定surveyCode的项目数

合并后,我也无法链接地图。有什么想法吗

我的尝试是:

var a=[{“id”:319268,“surveyCode”:“a”,“field3”:4},
{“id”:319269,“调查代码”:“A”,“字段3”:4},
{“id”:268393,“surveyCode”:“A”,“field3”:4},
{“id”:319266,“调查代码”:“A”,“字段3”:5},
{“id”:319267,“调查代码”:“C”,“字段3”:4},
{“id”:319267,“调查代码”:“B”,“字段3”:5}];
变量b=[{“surveyCode”:“C”},{“surveyCode”:“A”}]
var merge=function(){
var obj={},
i=0,
il=arguments.length,
钥匙
对于(;i{
const key=obj[属性];
如果(!acc[键]){
acc[键]=0;
}
acc[键]+;
返回acc;
}, {});
};
var allGroupedBySurveyCode=groupBy(a,'surveyCode');//返回[{“A”:4},{“B”:1},{“C”:1}]
var keepOnlyJoinedSurveyCodes=合并(c,allGroupedBySurveyCode);//不起作用-需要公共密钥,例如surveyCode,而不是A。
使用lodash时有任何问题吗? 我可能会直接伸手去拿:

您可以计算
surveyCode
的发生次数,并按分组数组映射计数

var data=[{id:319268,surveyCode:“A”,field3:4},{id:319269,surveyCode:“A”,field3:4},{id:268393,surveyCode:“A”,field3:4},{id:319266,surveyCode:“A”,field3:5},{id:319267,surveyCode:“C”,field3:4},{id:319267,surveyCode:“B”,field3:5},
groups=[{surveyCode:“C”},{surveyCode:“A”}],
计数=数据.reduce((r,{surveyCode})=>(r[surveyCode]=(r[surveyCode]| | 0)+1,r),{}),
结果=groups.map({surveyCode})=>({surveyCode,count:counts[surveyCode]}));
控制台日志(结果)

.as console wrapper{max height:100%!important;top:0;}
您可以映射调查代码,并对该特定调查代码的
a
中的每个条目进行计数。代码应该是这样的

const a=[
{id:319268,调查代码:'A',字段3:4},
{id:319269,调查代码:'A',字段3:4},
{id:268393,调查代码:'A',字段3:4},
{id:319266,调查代码:'A',字段3:5},
{id:319267,调查代码:“C”,字段3:4},
{id:319267,调查代码:'B',字段3:5}
];
常量b=[{surveyCode:'C'},{surveyCode:'A'}];
const result=b.map((项目)=>{
返回{…item,count:a.filter({surveyCode})=>surveyCode==item.surveyCode).length};
});

您可以尝试使用reduce

  • 循环数据,根据数组
    b
    属性过滤数据
  • 检查当前元素传递的属性是否存在于op上,如果存在,则将计数增加1,否则将其设置为所需值,然后将计数增加1
  • 以价值观为例
var a=[{“id”:319268,“surveyCode”:“a”,“field3”:4},
{“id”:319269,“调查代码”:“A”,“字段3”:4},
{“id”:268393,“surveyCode”:“A”,“field3”:4},
{“id”:319266,“调查代码”:“A”,“字段3”:5},
{“id”:319267,“调查代码”:“C”,“字段3”:4},
{“id”:319267,“调查代码”:“B”,“字段3”:5}];
函数groupBy(数据、属性){
变量b=[{“surveyCode”:“C”},{“surveyCode”:“A”}).map(v=>v[property])
让filteredData=data.filter(v=>b.includes(v[property]))
返回Object.values(filteredData.reduce((op,inp)=>{
op[inp[property]]=op[inp[property]]||{
[属性]:inp[属性],
计数:0
}
op[inp[属性]]计数++
返回操作
}, {}))
}

console.log(groupBy(a,'surveyCode'))
您可以使用
Array.map
Array.reduce
来计算数据数量

const a=[{
身份证号码:319268,
调查代码:“A”,
字段3:4,
},
{
身份证号码:319269,
调查代码:“A”,
字段3:4,
},
{
身份证号码:268393,
调查代码:“A”,
字段3:4,
},
{
身份证号码:319266,
调查代码:“A”,
字段3:5,
},
{
身份证号码:319267,
调查代码:“C”,
字段3:4,
}
];
常数b=[{
调查代码:“C”,
}, {
调查代码:“A”,
}];
//我们将创建一个名为“count”的新数组
//数组的条目数将与“b”相同
//Array.map将在“b”数组的每个项上循环并执行一个函数
//每个条目的函数结果将是
//新阵列
常量计数=b.map(x=>({
//我们复制新元素上“b”项的所有键
…x,
//我们将计算surveyCode被删除的时间
//在“a”数组上显示,为此,我们使用array.reduce
//Array.reduce将以值开始,并在“a”的每个条目上循环
//我们所做的很简单,调查代码是否相同?
//>是?计数+1,>否?计数+0
计数:a.reduce((tmp{
调查代码,
})=>(surveyCode===x.surveyCode?tmp+1:tmp),0),
}));

控制台日志(计数)虽然这在理论上可以回答这个问题,但在这里包含答案的基本部分,并提供链接供参考。我为您制作了一个片段。哪里是
c
?Downvoter在后面留下评论将有助于我了解我的答案中是否遗漏了什么。是的,有时我觉得有些答案被否决只是为了让自己的答案出现在顶部,以便获得更多的选票xD