【问题标题】:Merge Object keys and nested array data合并对象键和嵌套数组数据
【发布时间】:2020-08-10 09:04:59
【问题描述】:

我必须以表格的形式将新数据实施到遗留系统中。我只是不知道如何将对象值与键合并并将它们合并到数组键中

{
  "amount": [
    "33300.00",
    "43075.00",
    "93300.00",
    "193300.00",
  ],
  "rent_label": [
    "Due",
    "Due",
    "Due",
    "Due",
  ],
  "date": [
    "2020-04-02T00:00:00.000Z",
    "2020-03-03T00:00:00.000Z",
    "2020-02-04T00:00:00.000Z",
    "2020-01-15T00:00:00.000Z",
  ]
}

我已经尝试过的

let data = Object.keys(obj).map((key) => {
    let keyVal = Object.values(obj[key]).map((val) {
        return { [key]: val}
    })
    return data;
});


我更需要的是这样的数组

[
  {
    "amount": "33300.00",
    "rent_label": "Due",
    "date": "2020-04-02T00:00:00.000Z"
  },
  {
    "amount": "33300.00",
    "rent_label": "Due",
    "date": "2020-04-02T00:00:00.000Z"
  },
  {
    "amount": "33300.00",
    "rent_label": "Due",
    "date": "2020-04-02T00:00:00.000Z"
  },
]

【问题讨论】:

  • 你能展示你已经尝试过的东西吗?编辑问题以包含您已经编写的代码。
  • @DaneBrouwer 当然,1 秒
  • @DaneBrouwer 介意现在看看吗?

标签: javascript arrays object merge


【解决方案1】:

假设您知道所有属性的长度相同,这可能会成功:

let obj = {}; //Put your object here
let length = Object.keys(obj).length;

let outputArr = [];

for(let i = 0;i<length;i++){
    outputArr = {};
}

Object.keys(obj).forEach(function(key) {
    for(let i = 0;i<length;i++){
        outputArr[i][key]=arr[key][i];
    }
});

console.log(outputArr);

【讨论】:

    【解决方案2】:

    这样:

    const DATA_LENGTH = 4;
    
    const DATA = {
      "amount": ["33300.00","43075.00","93300.00","193300.00"],
      "rent_label": ["Due","Due","Due","Due"],
      "date": ["2020-04-02T00:00:00.000Z","2020-03-03T00:00:00.000Z","2020-02-04T00:00:00.000Z","2020-01-15T00:00:00.000Z"]
    };
    
    const newFormatData = [];
    
    const dataKeys = Object.keys(DATA);
    
    for (let i = 0; i < DATA_LENGTH; i++) {
      const obj = {};
      dataKeys.forEach(key => {
        obj[key] = DATA[key][i];
      });
    
      newFormatData.push(obj);
    }
    

    'newFormatData' 变量现在保存新的格式数据。

    【讨论】:

      【解决方案3】:

      如果数组的大小根据key不同,可以这样做:

      const input = {
        "amount": ["33300.00", "43075.00", "93300.00", "193300.00"],
        "rent_label": ["Due", "Due", "Due", "Due", "TEST"],
        "date": ["2020-04-02T00:00:00.000Z", "2020-03-03T00:00:00.000Z", "2020-02-04T00:00:00.000Z", "2020-01-15T00:00:00.000Z"]
      }
      
      function merge (data) {
          const result = []
          const keys = Object.keys(data)
          const maxLength = Math.max(...keys.map(e => data[e].length))
      
          for (let index = 0; index < maxLength; index++) {
      	result.push(keys.reduce((acc, value) => {
      	    acc[value] = data[value][index] || null
      	    return acc
      	}, {}))
          }
      
          return result
      }
      
      console.log(merge(input))

      【讨论】:

        【解决方案4】:

        const keys = Object.keys(obj);
        const count = obj[keys[0]].length;
        const array = [...Array(n).keys()].map(i => keys.reduce((acc, key) => ({...acc, [key]: obj[key][i]}), {}));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-11-22
          • 2018-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多