如何使用不可变JS对列表中的项目进行计数

How to count items in List with ImmutableJS?

本文关键字:项目 不可变 何使用 JS 列表      更新时间:2023-09-26

我有一个列表,看起来像这样:

["green", "blue","green","green", "blue", "black"]

如何使用不可变JS运算符来计算这些项目并获得如下所示的Map:

{ green: {name: green, count: 3}, blue:{name: blue, count: 2}, black:{name: black, count: 1}}

我在这里找到了以下函数,可以在普通 JS 中做到这一点,那么我如何使用不可变 JS 实现这一点呢?

export const countOccurances = obj => {
   return obj
        .reduce((counter, x) =>  {
            if (counter.hasOwnProperty(x)) { 
                counter[x].count = counter[x].count + 1
            } else {
                counter[x] =  {name: x, count: 1}
            }
            return counter;
        }, {})
 }

尝试groupBy后跟map。像这样:

list.groupBy(elem => elem).map(arr => {
    return  {"name" : arr.get(0), "count": arr.size }
})

list.groupBy(elem => elem)将返回一个KeyedSeq,其中颜色字符串作为键,Iterable字符串作为值。在纯 JS 中看起来像这样。

{ green: ["green","green","green"], blue:["blue","blue"], black: ["black"]}

然后我们可以映射这些以返回可迭代对象的大小以及名称,我们应该得到你想要的:

{ green: {name: "green", count: 3}, blue:{name: "blue", count: 2}, black:{name: "black", count: 1}}

当然,如果你想得到确切的,你需要在最后使用toJS()

您也可以使用混合解决方案:

list.toJS().length