【问题标题】:Merge Array to Object Array JavaScript将数组合并到对象数组 JavaScript
【发布时间】:2017-05-03 07:12:07
【问题描述】:

我这里有一个数组:

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

有什么帮助吗?

【问题讨论】:

  • 我有点困惑。你想如何合并它们?

标签: javascript arrays object


【解决方案1】:

使用[].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));

【讨论】:

  • @GaaraItachiUchiha — 我在帖子中提供了参考链接。我希望这会有所帮助:)
【解决方案2】:

您可以简单地使用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】:

    看到这个:

    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】:

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

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

      【讨论】:

      • 不要在内部循环中使用map
      • @Cerbrus forEach 更好?
      • 是的。 map 用于修改数组。 forEach 当你不想修改源数组,而只是循环它。
      • 好的,明白了!
      【解决方案5】:

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

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

      【讨论】:

      • 这不是 OP 想要的。
      • 不幸的是,OP 没有具体说明他们想要什么,但是,他们确实说他们已经创建了代码来完成所有其他答案的工作,但表示他们想合并结果。唯一包含对象而不是数组的示例。这回答了这个问题,以及为什么我在回答之前对此进行了解释。无论如何,感谢您的反对。
      • 关于所需输出格式的问题非常清楚。这个答案返回的东西完全不同。
      • "我创建了一个函数,可以像这样将我的函数转换为 obj 数组", "所以我创建了一个函数来做到这一点。但是我不确定从哪里开始合并它们。 "在我看来不是很清楚...
      • 如果您认为不清楚,为什么要回答而不是近距离投票为“不清楚”?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 2019-06-28
      • 2023-01-16
      • 1970-01-01
      • 2023-01-11
      相关资源
      最近更新 更多