首页 > 解决方案 > 将数组数组转换为对象数组

问题描述

我有一个数组数组(二维数组),我想将它转换成一个对象数组。在结果数组中,我希望每个对象都有一个键名(请参阅下面的预期输出)

data = [
 ['Apple', 'Orange', 'Banana', 'Pears', 'Peach'],
 [40, 35, 25, 58, 84],
 [2, 4, 4, 3, 1, 2],
 ['Red', 'Yellow', 'Green', 'Violet', 'Blue']
];

我的预期结果:

expected_result = [
  {name: 'Apple', price: 40, quantity: 2, color: 'Red'},
  {name: 'Orange', price: 35, quantity: 4, color: 'Yellow'},
  {name: 'Banana', price: 25, quantity: 4, color: 'Green'},
  {name: 'Pears', price: 58, quantity: 1, color: 'Violet'},
  {name: 'Peach', price: 84, quantity: 2, color: 'Blue'}
];

注意每个数组 (in data) 的迭代应该是连续的,以便给出预期的结果

标签: javascript

解决方案


一种解决方案包括首先在索引和要分配给它们的(或)名称之间创建一个Map (但是可以用这样的数组替换它)。此外,您可以获取内部数组的 ,以便稍后检查是否没有创建不具有所有属性的数组。完成此预初始化后,您可以使用Array.reduce()生成预期结果:outter-arraypropertykey["name","price","quantity","color"]minimun lengthobjects

const data = [
 ['Apple', 'Orange', 'Banana', 'Pears', 'Peach'],
 [40, 35, 25, 58, 84],
 [2, 4, 4, 3, 1, 2],
 ['Red', 'Yellow', 'Green', 'Violet', 'Blue']
];

let mapIdxToProp = new Map([[0, "name"],[1, "price"],[2, "quantity"],[3, "color"]]);
let minLen = Math.min(...data.map(x => x.length));

let res = data.reduce((acc, arr, idx) =>
{
    arr.forEach((x, j) =>
    {
        (j < minLen) && (acc[j] = acc[j] || {}, acc[j][mapIdxToProp.get(idx)] = x);
    });
    return acc;
}, []);

console.log(res);


推荐阅读