首页 > 解决方案 > 如何将多个对象合并/组合成数组

问题描述

我正在寻找将对象合并到数组中的最佳方法..这是我的问题:

Object {
  "payload": Array [
    Object {
      "category": "kontrakan",
    },
    Object {
      "Tenant": "anji",
    },
  ],
  "type": "GET_DATA_VENUE_SUCCESS",
}

Object {
  "payload": Array [
    Object {
      "category": "kost",
    },
    Object {
      "Tenant": "ade",
    },
  ],
  "type": "GET_DATA_VENUE_SUCCESS",
} 

期望像这样转换:

{
  [
   {"category" : "kontrakan","Tenant" : "anji"}, 
   {"category" : "kost", "Tenant" : "ade"}
  ]
}

这里代码:

let obj = doc.data();
let arrObj = _.map(_.keys(obj), key => ({ [key]: obj[key] }));
console.log(arrObj);

我已经尝试过其他解决方案。object.assign/key, lodash : _.merge, union 仍然无法正常工作...

标签: javascriptarraysdictionaryobjectarrayobject

解决方案


您正在寻找的功能是reduce

您可以使用 reduce 将“有效负载”数据组合到单个对象中。通过使用对象作为累加器。

例子:

const a = {
  payload: [{
    category: 'a'
  },
  {
    tenant: 'a'
  }]
};


function mergePayload(obj) {
  return obj.payload.reduce((newObj, payloadObj) => {
    // Create a new object with the properties of the old and the new combined
    return Object.assign(newObj, payloadObj);
  }, {});
}

// {category: "a", tenant: "a"}
console.log(mergePayload(a))

您可以将包含数据的数组映射到 reducer:

const data = [a, a];

// [{category: "a", tenant: "a"}, {category: "a", tenant: "a"}]
console.log(data.map((d) => mergePayload(d)));

编辑:您可以缩短减少时间,但这将不再为评论腾出空间。

function mergePayload(obj) {
  return obj.payload.reduce((newObj, payloadObj) => Object.assign(newObj, payloadObj), {})
}

推荐阅读