JavaScript - 使用es6

时间:2017-12-19 22:51:19

标签: 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"
    }
]

我在表格中显示这些内容并希望添加复选框过滤器,但我还想在其旁边添加一个计数,如下所示:

[x] Google (2)
[ ] Microsoft (1)
// other function call
[ ] mail@mail.com (2)

我有这个功能我会拨打每一个键(公司,位置,电子邮件):

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");

我试图通过上述功能实现的输出是: 谷歌:2 Microsft:1

foreach正确计算键值,但显然记录了以下内容: 谷歌:2 微软:1 谷歌:2

过滤器console.log显示了Google和Microsoft(只需一次,就像我想要的那样)。

现在我需要将这两个结合起来,但我不知道如何以及最好的方法是什么。 (见我的小提琴:https://jsfiddle.net/z359qo1d/

你知道接下来要做什么吗?

2 个答案:

答案 0 :(得分:4)

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;    
  }, {})
}

以上将返回这样的对象

{
  Google: 2,
  Microsoft: 1
}

答案 1 :(得分:0)

我的做法有点不同:

let _in = [
{
    "company": "Google",
    "location": "USA",
    "email": null
},
{
    "company": "Microsoft",
    "location": "USA",
    "email": "mail@mail.com"
},
{
    "company": "Google",
    "location": "NLD",
    "email": "mail@mail.com"
}
]

function countEm(accum, each) {
  if (! accum[each.company] )
    accum[each.company] = 0
  accum[each.company] += 1
  return accum
}

console.log(_in.reduce(countEm, {}))