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

时间:2016-01-25 12:58:39

标签: javascript arrays

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

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"
    }
};

another thread中,我遇到了 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()来获取嵌套对象,或者我在这里需要不同的方法。

安德烈亚斯

修改

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

3 个答案:

答案 0 :(得分:2)

具有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>');
&#13;
&#13;
&#13;

答案 1 :(得分:1)

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>');

答案 2 :(得分:0)

我认为最简单的方法是使用map function

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(int i=1;myArray.length;i++)
{
    var el = myArray[i];
    myObjects2[el[0]] = { 
        'Name': el[0],
        'Age': el[1],
        'Profession': el[2]
    }
}