首页 > 解决方案 > JavaScript:在没有 ES6 的情况下将两个列表合并到 JSON 对象中并将相同的键值附加在一起

问题描述

一个快速的 JavaScript 问题。给定两个数组并假设它们的长度相同。我想将这两个数组组合成一个 json 对象数组。此外,如果代码已经存在于数组中,则将错误附加到现有的 .error 元素中。如果有人可以提供使用 vanilla javascript 而不是 ES6 的解决方案,我们将不胜感激。

var codes = ["12345", "12345","67890", "67890", "67890","67890","12092", "12092"];

var errors = ["12345 error 1","12345 error 2","67890 error 1","67890 error 2","67890 error 3","67890 error 4","12092 error 1","12092 error 2"];

应该转化为

{
    "code": "12345",
    "error": "12345 error 1, 12345 error 2"
},
{
    "code": "67890",
    "error": "67890 error 1, 67890 error 2, 67890 error 3, 67890 error 4, 67890 error 5"
},
{
    "code": "12092",
    "error": "12092 error 1 , 12092 error 2"
}

标签: javascriptarrays

解决方案


您可以使用地图组合它们,然后将它们分组并将其转换为对象数组,然后

const codes = ["12345", "12345","67890", "67890", "67890","67890","12092", "12092"];
const errors = ["12345 error 1","12345 error 2","67890 error 1","67890 error 2","67890 error 3","67890 error 4","12092 error 1", "12092 error 2"];

const res = Array.from(
    codes.map((e, i) => ({code: e, errors: errors[i]}))
        .reduce((a, b) => a.set(b.code, (a.get(b.code) || []).concat(b.errors)), new Map))
    .map(([k, v]) => ({code:k, errors: v}));
console.log(res);

如果您真的希望错误是单个字符串,请添加 .join()

.map(([k, v]) => ({code:k, errors: v.join()}));

前 ES6 版本

var codes = ["12345", "12345", "67890", "67890", "67890", "67890", "12092", "12092"];
var errors = ["12345 error 1", "12345 error 2", "67890 error 1", "67890 error 2", "67890 error 3", "67890 error 4", "12092 error 1", "12092 error 2"];

var grouped =
  codes.map(function(e, i) {
    return {
      code: e,
      errors: errors[i]
    };
  })
  .reduce(function(a, b) {
    a[b.code] = (a[b.code] || []).concat(b.errors);
    return a;
  }, {});

var res = Object.keys(grouped).map(function(e) {
  return {
    code: e,
    errors: grouped[e]
  }
});

console.log(res);


推荐阅读