为了账号安全,请及时绑定邮箱和手机立即绑定

如何仅使用 ES6 替换 Lodash 的 _.countBy?

如何仅使用 ES6 替换 Lodash 的 _.countBy?

郎朗坤 2023-08-18 14:14:38
取下面的数组 const data = [[150, 1], [300, 2], [430, 1]]有了 Lodash,countBy我就可以做到_.countBy(row => row[1]),它会返回一个像这样的对象{"1": 2, "2":1}。它基本上计算出现次数并将其放入一个对象中。我怎样才能用 ES6 语法做同样的事情?
查看完整描述

2 回答

?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

对于 MapReduce 来说,这似乎是一项相当简单的工作。以下函数接受数组和选择器参数。选择器参数传递给映射以检索要计数的项目。Reduce 用于通过从空对象文字开始并在每次传递时递增给定键的值来累积结果。


function countBy(ary, selector) {

  return ary.map(selector)

    .reduce((acc, cur) => { acc[cur] = (acc[cur] || 0) + 1; return acc; } ,{});

    // fancy spread version:

    // .reduce((acc, cur) => ({ ...acc, [cur]: (acc[cur] || 0) + 1 }) ,{});

}

// view console.log for result

console.log(countBy([[150, 1], [300, 2], [430, 1]], x => x[1]));


查看完整回答
反对 回复 2023-08-18
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

您可以使用一个简单的循环,通过调用回调获取键,并将键/值对分配给结果对象:


function countBy(data, getKey) {

    let count = {};

    for (let row of data) {

        let key = getKey(row);

        count[key] = (count[key] || 0) + 1;

    }

    return count;

}


const data = [[150, 1], [300, 2], [430, 1]]

console.log(countBy(data, row => row[1]));


查看完整回答
反对 回复 2023-08-18
  • 2 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信