JavaScript - 数组转对象

19 阅读2分钟

在 JavaScript 中,将数组转换为对象有多种方法,具体取决于数组的结构和转换需求。以下是常见的几种场景及对应的实现方法:


1. 数组元素为键值对(如二维数组)

如果数组的每个元素是 [key, value] 格式的键值对,可以直接用 Object.fromEntries() 转换。

const arr = [['name', 'John'], ['age', 30], ['city', 'New York']];

// 转换为对象
const obj = Object.fromEntries(arr);
console.log(obj); 
// { name: "John", age: 30, city: "New York" }

2. 数组索引作为对象的键

将数组的索引转为对象的键,值对应数组元素:

const arr = ['apple', 'banana', 'orange'];

// 方法 1: 使用 reduce
const obj1 = arr.reduce((acc, value, index) => {
  acc[index] = value;
  return acc;
}, {});

// 方法 2: 直接遍历
const obj2 = {};
arr.forEach((value, index) => {
  obj2[index] = value;
});

console.log(obj1); // { 0: "apple", 1: "banana", 2: "orange" }
console.log(obj2); // { 0: "apple", 1: "banana", 2: "orange" }

3. 自定义转换规则

如果数组需要根据特定规则转为对象(如属性名映射),可以用 reduce 灵活处理。

const users = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bob' }
];

// 将数组转为 { id: name } 格式的对象
const userMap = users.reduce((acc, user) => {
  acc[user.id] = user.name;
  return acc;
}, {});

console.log(userMap); 
// { 1: "Alice", 2: "Bob" }

4. 处理特殊结构的数组

如果数组元素是对象,需提取特定字段组合成新对象:

const products = [
  { sku: 'A1', price: 100 },
  { sku: 'B2', price: 200 }
];

// 转为 { sku: price } 格式的对象
const priceMap = products.reduce((acc, product) => {
  acc[product.sku] = product.price;
  return acc;
}, {});

console.log(priceMap); 
// { A1: 100, B2: 200 }

总结

场景推荐方法
键值对数组([[key, value]]Object.fromEntries()
索引作为键reduceforEach 遍历
自定义复杂转换逻辑reduce

注意事项

  1. Object.fromEntries() 的兼容性:ES2019+ 支持,旧环境需 polyfill。
  2. 避免覆盖同名属性:合并时若键名冲突,后面的值会覆盖前面的。
  3. 深层嵌套数组:如需处理多层结构,可能需要递归或更复杂的逻辑。