将类似表的二维数组转换为对象 (JavaScript)

Transform table-like 2-dimensional array to object (JavaScript)

本文关键字:对象 JavaScript 转换 二维数组      更新时间:2023-09-26

我有一个二维数组,看起来像这样:

var myArray = [
    ['Name', 'Age', 'Profession'],
    ['John', 34, 'Teacher'],
    ['Jane', 45, 'Artist']
];

我想将此数组转换为如下所示的对象:

var myObject =
{
    "Name":
    {
        "Name": "Name",
        "Age": "Age",
        "Profession": "Profession"
    }
    "John":
    {
        "Name": "John",
        "Age": 34,
        "Profession": "Teacher"
    }
    "Jane":
    {
        "Name": "Jane",
        "Age": 45,
        "Profession": "Artist"
    }
};

在另一个线程中,我遇到了Array.prototype.reduce(),我能够执行以下操作:

var myObject = myArray.reduce(function(result, currentItem) {
  result[currentItem[0]] = currentItem;
  return result;
}, {})
Logger.log(myObject);
// {John=[John, 34.0, Teacher], Jane=[Jane, 45.0, Artist], Name=[Name, Age, Profession]}

但是,我不知道如何应用 reduce() 来获取嵌套对象,或者我是否需要在这里使用不同的方法。

安德烈亚斯

编辑:

  • 正在寻找一个动态解决方案,即:我事先不知道我的数组包含多少元素或它们的值是什么。
  • 我更喜欢一个比遍历所有元素(如果可能)更快、更优雅的解决方案。

具有reduce和对象以及一些嵌套属性的解决方案。

var myArray = [['Name', 'Age', 'Profession'], ['John', 34, 'Teacher'], ['Jane', 45, 'Artist']],
    result = myArray.reduce(function (r, a) {
        // get the first element ('Name', 'John', 'Jane') of myArray and take it as a key
        // for the object. generate a new object if there is no object available
        // read here: r.Name = r.Name || {}
        r[a[0]] = r[a[0]] || {};
        // iterate over ['Name', 'Age', 'Profession']
        myArray[0].forEach(function (b, i) {
            // assign the according value to the according property of the object
            // read here: r.Name.Name = 'Name'
            // next       r.Name.Age = 'Age'
            r[a[0]][b] = a[i];
        });
        return r;
    }, {});
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

myArray.reduce(
function ( r, a )
{
    var row = a.reduce(
        function ( rr, cc, i )
        {
            rr[ myArray[ 0 ][ i ] ] = cc;
            return rr;
        }, {} );
    r[ a[ 0 ] ] = row;
    return r;
}, {} );

这个想法是在每一行做相同的减少。

var myArray = [
  ['Name', 'Age', 'Profession'],
  ['John', 34, 'Teacher'],
  ['Jane', 45, 'Artist']
];
var result = myArray.reduce(
  function(r, a) {
    var row = a.reduce(
      function(rr, cc, i) {
        rr[myArray[0][i]] = cc;
        return rr;
      }, {});
    r[a[0]] = row;
    return r;
  }, {});
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

我认为最简单的

方法可能是使用 map

函数
var myArray = [
    ['Name', 'Age', 'Profession'],
    ['John', 34, 'Teacher'],
    ['Jane', 45, 'Artist']
];
var myObjects = myArray.map(function(el) { 
    return { 
        'Name': el[0],
        'Age': el[1],
        'Profession': el[2]
    } 
});

另一种方法是只使用 on for 语句

for(int i=1;myArray.length;i++)
{
    var el = myArray[i];
    myObjects2[el[0]] = { 
        'Name': el[0],
        'Age': el[1],
        'Profession': el[2]
    }
}