将数组合并到对象数组JavaScript

时间:2017-05-03 07:12:08

标签: javascript arrays object

我在这里有一个数组:

var array = [
    [
        ['firstName', 'Nork'], ['lastName', 'James'], ['age', 22], ['position', 'writer']
    ],
    [
        ['firstName', 'James'], ['lastName', 'Rodel'], ['age', 25], ['position', 'programmer']
    ]
];

我创建了一个函数,将我的函数转换为obj数组,如下所示:

[
    {firstName: 'Nork', lastName: 'James', age: 22, position: 'writer'},
    {firstName: 'James', lastName: 'Rodel', age: 25, role: 'programmer'}
]

所以我创建了一个函数来做到这一点。但是我不知道从哪里开始让我合并它们。

function changeData(array) {
  var obj = { };

}

changeData(array);

任何帮助?

5 个答案:

答案 0 :(得分:2)

使用[].map而不是[].reduce

  

map()方法创建一个新数组,其结果是在此数组中的每个元素上调用提供的函数。   

<小时/>   reduce()方法对累加器和数组中的每个元素(从左到右)应用函数以将其减少为单个值。

var array = [
  [
    ['firstName', 'Nork'],
    ['lastName', 'James'],
    ['age', 22],
    ['position', 'writer']
  ],
  [
    ['firstName', 'James'],
    ['lastName', 'Rodel'],
    ['age', 25],
    ['position', 'programmer']
  ]
];

function mergeObjectArray(array) {
  return array.map(function(el) {
    return el.reduce(function(a, b) {
      a[b[0]] = b[1];
      return a;
    }, {})
  });
}
console.log(mergeObjectArray(array));

答案 1 :(得分:1)

您可以映射到数组并分配动态属性,例如obj[prop] = value

&#13;
&#13;
var array = [
    [
        ['firstName', 'Nork'], ['lastName', 'James'], ['age', 22], ['position', 'writer']
    ],
    [
        ['firstName', 'James'], ['lastName', 'Rodel'], ['age', 25], ['position', 'programmer']
    ]
];

var convertedArray = array.map(function(line){
   var obj = {};
   line.forEach(function(prop){
     obj[prop[0]]=prop[1];
   });
   return obj;
});

console.log(convertedArray);
&#13;
&#13;
&#13;

答案 2 :(得分:1)

你可以使用Array.prototype.map()循环遍历第一个数组,并在其回调中循环Array.prototype.forEach()以循环子数组并将它们合并到一个唯一的对象中:

var merged = array.map(function(arr) {
  var obj = {};
  arr.forEach(function(item) {
    obj[item[0]] = item[1];
  });
  return obj;
});

<强>演示:

var array = [
  [
    ['firstName', 'Nork'],
    ['lastName', 'James'],
    ['age', 22],
    ['position', 'writer']
  ],
  [
    ['firstName', 'James'],
    ['lastName', 'Rodel'],
    ['age', 25],
    ['position', 'programmer']
  ]
];

var merged = array.map(function(arr) {
  var obj = {};
  arr.forEach(function(item) {
    obj[item[0]] = item[1];
  });
  return obj;
});
console.log(merged);

答案 3 :(得分:0)

见这一个:

var array = [
    [
        ['firstName', 'Nork'], ['lastName', 'James'], ['age', 22], ['position', 'writer']
    ],
    [
        ['firstName', 'James'], ['lastName', 'Rodel'], ['age', 25], ['position', 'programmer']
    ]
];

function changeData(array)
{
    var i,j;
    var ret = [];
    var tmp = {};

    // rotate through every line and create a temporary object which we push to the return array
    for (i=0;i<array.length;i++)
    {
        tmp = {};
        for (j=0;j<array[i].length;j++) tmp[ array[i][j][0] ] = array[i][j][1];
        ret.push(tmp);
    }
    return ret;
}

console.log(changeData(array));

答案 4 :(得分:-1)

您尚未指定合并用户的方式。这将获取您的用户对象数组,并将所有结果减少到一个对象中,并提供所有值的数组。

&#13;
&#13;
var array = [
  {firstName: 'Nork', lastName: 'James', age: 22, position: 'writer'},
  {firstName: 'James', lastName: 'Rodel', age: 25, role: 'programmer'}
]

function changeData(array) {
  return array.reduce((users, user) => {
    Object.keys(user).forEach(key => {
      users[key+'s'] = Array.isArray(users[key+'s']) ? users[key+'s'].concat(user[key]) : [user[key]]
    })
    return users
  }, {})
}

console.log(
  changeData(array)
)
&#13;
&#13;
&#13;