如何在JavaScript中向Map添加一个键值对数组?

4
我有一个键值对数组,其中每个键都有另一个常量长度(即2)的数组作为值。如何将整个数组添加到Map()中,而不仅仅是针对每个键值对执行Map.set(key, value)
我知道在创建Map()实例时可以将可迭代对象(例如数组)传递给它,比如:let x = new Map(arr);但据文档所述,这在IE 11中不被支持,详见此处。因此,有没有人能帮我想出一种替代方案。
最终,我只想能够使用字符串键访问这两个值。如果有其他实现方式,请指导我。
以下是示例:
我创建了一个键值映射数组,如下所示:
let arr = [
        ['ar', ['cl', 'bl']],
        ['bs', ['kl', 'ml']],
        ['cs', ['rk', 'uk']],
        ['da', ['mk', 'ak']]
    ];
let map = new Map(arr); // This isn't working. 

谢谢。

2个回答

5

如果需要支持未实现Map的浏览器,只需使用普通对象,其中第一个数组项将是键,第二个(子数组)将是值:

var arr = [
        ['ar', ['cl', 'bl']],
        ['bs', ['kl', 'ml']],
        ['cs', ['rk', 'uk']],
        ['da', ['mk', 'ak']]
    ];

var map = arr.reduce(function (obj, item) {
    obj[item[0]] = item[1];
    return obj;
}, {});

console.log(map['ar'], map.bs);

或者使用ES2015方法(在IE11中无效):

const map = arr.reduce((obj, item) => ({
    ...obj,
    [item[0]]: item[1],
}), {});

如果你想通过字符串键访问子数组,你仍然需要将其从数组转换。

如果你想使用Map,那么(除了修复数组定义中的拼写错误),你可以通过Map.prototype.get函数提取内容:

var map = new Map(arr);
console.log(map.get('bs'));

如果您不想创建一个新的对象,另一种方法可以使用Array.filter:

arr.filter(function (item) { return item[0] === 'ar' })[0][1];
arr.filter((item) => item[0] === 'ar')[0][1]; // ES2015

(可能包含在函数中)


如果对象中没有该键,我应该如何处理这种情况? - Tums
不确定您的意思,是指只有子数组 ['cl', 'bl'] 而不是 ['ar', ['cl', 'bl']] 吗?那么请将其保持为普通数组,可以通过索引进行选择,或者可以将其转换为对象,例如通过使第一个项目成为键 { cl: ['cl', 'bl'], kl: ['kl', 'ml'] } - Tomas Varga

1
你可以使用一个对象。
let obj = 
{ ar:['cl', 'bl'],
  bs:['kl', 'ml'],
  cs:['rk', 'uk'],
  da:['mk', 'ak']
};
console.log(obj['bs'][1]); // displays 'ml'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接