首页 > 解决方案 > JS - 数组数组

问题描述

我有一些数组:

let someArr = [["A","B"],["A","C"],["C","A"],["B","D"]]

我想要返回对象,该对象包括名称和他的计数器(名称在所有内部数组中重复了多少次。

预期输出为{"A":3, "B":2,"C":2,"D":1}

初始对象:

let returnObj = {name:"",count:0}

现在我想这样做:

someArr.foreach(arr => {
    return (
        arr.map(item => {
            //check if item in returnObj then count++,
            // but how can i check if i have many names and its counter?
            //Maybe I need return array of objects?
            //else add this item to returnObj and count++
       })
    );
})

你有其他想法我怎么数名字吗?

标签: javascriptarrays

解决方案


这就是我为你想出的——希望这就是你所追求的:

var arr = [["A","B"],["A","C"],["C","A"],["B","D"]]

var obj = arr.flat().reduce((acc, item) => ({...acc, [item]:(acc[item]||0) + 1}), {})

console.log(obj)

首先,展平数组数组,并使用一种reduce方法迭代所有内容,这使得解决方案最短。

在每次迭代时返回修改后的累加器内部reduce,并为当前扫描的项目返回一个新计数。

如果在累加器中没有找到一个项目(作为键),这意味着它是第一次遇到,然后应该被视为0并简单地添加1到它。否则,只需使用该键(项目)的最后一个计数值并添加1到它。


奖励- 您也可以不同地编写 reduce,无需在每次迭代时解构,始终保持对原始累加器的相同引用:

arr.flat().reduce((acc, item) => (acc[item] = (acc[item]||0) + 1, acc), {})

推荐阅读