Javascript:使用集合作为键来创建字典/地图/对象

时间:2019-01-17 15:50:42

标签: javascript dictionary set

有什么明智的方法可以在Javascript中将键设置为Set对象的字典?

对于上下文,我的问题是我有一个列表列表,并且想要计算每种组合出现的次数,而忽略元素的顺序和重复。我可以制作一个字典,其中的列表本身就是元素,但是如果我尝试使用集合,则将每个集合都视为具有值[object Set]的相同键。

例如:

var list_of_lists = [[1,2], [1], [1], [2,1], [1,1]]
var count_of_id_combos = {}
var count_of_id_combo_sets = {}

list_of_lists.forEach(
    function(sub_list, index){
        count_of_id_combos[sub_list] = (count_of_id_combos[sub_list] || 0) + 1
        var set_of_sublist = new Set(sub_list)
        count_of_id_combo_sets[set_of_sublist] = (count_of_id_combo_sets[set_of_sublist] || 0) + 1

    }
)
console.log(count_of_id_combos) // -> Object {1: 2, 1,2: 1, 2,1: 1, 1,1: 1}
console.log(count_of_id_combo_sets) // -> Object {[object Set]: 5}

而我希望第二个对象是类似的

Object {1: 3, 1,2: 2}

我也尝试过使用Map并且发生了同样的事情。我想出的唯一解决方案是手动过滤出重复项,然后对列表进行排序,虽然可行,但看起来过于复杂,我想知道是否缺少某些东西。

1 个答案:

答案 0 :(得分:1)

一种执行所需操作的方法是将集合转换为字符串。例如,

let map = new Map()

let setSet = new Set([3, 1, 2])
let setKey = Array.from(setSet).sort().join()
map.set(setKey, "foo")

let getSet = new Set([2, 1, 1, 3])
let getKey = Array.from(getSet).sort().join()
console.log(map.get(getKey))