elD*_*imm 1 javascript arrays filter ecmascript-6
我正在尝试解决此问题,但是我有点卡住,需要一些帮助/建议。我试图越来越了解es6,但是对于解决问题的最佳方法我一无所知。
我要撷取的大型json看起来像这样:
[
{
"company": "Google",
"location": "USA",
"email": null
},
{
"company": "Microsoft",
"location": "USA",
"email": "mail@mail.com"
},
{
"company": "Google",
"location": "NLD",
"email": "mail@mail.com"
}
]
Run Code Online (Sandbox Code Playgroud)
我将它们显示在表格中,并希望添加复选框过滤器,但是我也想在其旁边添加一个计数,如下所示:
[x] Google (2)
[ ] Microsoft (1)
// other function call
[ ] mail@mail.com (2)
Run Code Online (Sandbox Code Playgroud)
我有这个功能,我会呼叫每个按键(公司,位置,电子邮件):
function filterArr(data, key) {
data.forEach(element => {
let countedData = data.filter((el) => {
return el[key] == element[key]
}).length;
// console.log(element[key] + ": " + countedData);
});
data = data.filter((item, index, self) => self.findIndex( t => t[key] === item[key] && item[key] != null) === index )
// console.log(data)
return data;
}
filterArr(data, "company");
Run Code Online (Sandbox Code Playgroud)
我尝试通过上述功能实现的输出是:Google:2 Microsft:1
foreach正确地计算了键值,但显然记录了以下内容:Google:2 Microsoft:1 Google:2
过滤器console.log显示Google和Microsoft(仅一次,就像我想要的那样:)
现在,我需要将这2种方法结合起来,但是我不确定如何以及最好的方法是什么。(请参阅我的小提琴:https : //jsfiddle.net/z359qo1d/)
你知道下一步该怎么做吗?
Array.prototype.reduce 是您想要的完美搭配
function filterArr(data, key){
return data.reduce( (result, current) => {
if(!result[current[key]]){
result[current[key]] = 1;
} else {
result[current[key]] += 1;
}
return result;
}, {})
}
Run Code Online (Sandbox Code Playgroud)
上面将返回这样的对象
{
Google: 2,
Microsoft: 1
}
Run Code Online (Sandbox Code Playgroud)