在JavaScript中使用map或reduce将2D数组转换为对象

4

是否可以使用.map().reduce()方法将

[[35,"Bill"],[20,"Nancy"],[27,"Joan"]]

转换为

{"Bill": 35,"Nancy": 20,"Joan": 27}

我可以使用以下方式转换数组:

const arr = [[35, "Bill"], [20, "Nancy"], [27, "Joan"]];

let obj = {};

for (let item of arr) {
  obj[item[1]] = item[0];
}

console.log(obj);

但是我使用mapreduce尝试做到这一点都失败了,有什么想法吗?

4个回答

13
如果支持,您可以使用Object.fromEntries()将一组[key, value]对的数组转换为对象。在这种情况下,这些对是[value,key],因此我们需要先将它们映射到一个[key,value]对的数组。

const arr = [[35, "Bill"], [20, "Nancy"], [27, "Joan"]];

const obj = Object.fromEntries(arr.map(([v, k]) => [k, v]));

console.log(obj);

使用Array.map()创建一个包含单个键/值的对象数组。通过spreadObject.assign()中将它们合并为一个单独的对象:

const arr = [[35, "Bill"], [20, "Nancy"], [27, "Joan"]];

const obj = Object.assign(...arr.map(([v, k]) => ({ [k]: v })));

console.log(obj);

如果您需要将对象用作字典,更好的解决方案是将元组数组转换为Map

const arr = [[35, "Bill"], [20, "Nancy"], [27, "Joan"]];

const map = new Map(arr.map(([v, k]) => [k, v]));

console.log(map.get('Bill'));


谢谢!在 map 返回中,为什么需要给键加上方括号 ([k])?我也做了类似的操作,但是没有加括号,而是写成了 ...=> ({k: v}) - N1B4
2
当您创建像这样的对象 { k: v } 时,键名是字母 k,而不是 k 的值。要获取该值,您需要使用计算属性名称 - [k]。 - Ori Drori

6

是的,你可以使用reduce - 在每次迭代中,从数组中提取两个项目(作为键和值),将值分配给累加器中的适当键,并返回累加器:

const input = [[35, "Bill"], [20, "Nancy"], [27, "Joan"]];
const obj = input.reduce((a, [val, key]) => {
  a[key] = val;
  return a;
}, {});
console.log(obj);


2
你可以使用Object.assign方法, 将项目映射为新对象并全部分配到单个对象中。

var array = [[35, "Bill"], [20, "Nancy"], [27, "Joan"]],
    object = Object.assign(...array.map(([v, k]) => ({ [k]: v })));
    
console.log(object);


0

你可以使用reduceObject.assign

let array = [[35, "Bill"], [20, "Nancy"], [27, "Joan"]];
    
let result = array.reduce((acc, [value, key]) => Object.assign(acc, { [key]: value }), {});
    
console.log(result);


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