【问题标题】:How to modify JSON response array to add new keys in NodeJS?如何修改 JSON 响应数组以在 NodeJS 中添加新键?
【发布时间】:2021-02-05 02:32:30
【问题描述】:

我有一个返回以下 JSON 数组的 NodeJS 函数。它包含1 类型的所有错误:

const data1 =
[
  {
    "ErrorType": "Error-1A",
    "Error": "wrong ip address for 1A",
    "SERVER_COUNT": 9
  },
  {
    "ErrorType": "Error-1B",
    "Error": "password incorrect for 1B",
    "SERVER_COUNT": 2
  },
....
]

我有另一个 JSON 数组来存储 2 类型的所有错误:

const data2 = 
[
  {
    "ErrorType": "Error-2A",
    "Error": "wrong data for 2A",
    "SERVER_COUNT": 8
  },
  {
    "ErrorType": "Error-2B",
    "Error": "password incorrect for 2B",
    "SERVER_COUNT": 3
  },
....
]

我有另一个 JSON 数组用于所有 3 类型的错误:

const data3 = 
[
  {
    "ErrorType": "Error-3A",
    "Error": "wrong data for 3A",
    "SERVER_COUNT": 1
  },
  {
    "ErrorType": "Error-3B",
    "Error": "password incorrect for 3C",
    "SERVER_COUNT": 5
  },
....
]

我想组合 3 个 JSON 数组 data1data2data3,最终的 JSON 对象应如下所示:

{
  "details1": {
   "9": {
    "ErrorType": "Error-1A",
    "Error": "wrong ip address for 1A"
   },
      "2": {
    "ErrorType": "Error-1B",
    "Error": "password incorrect for 1B"
   }
},
  "details2": {
   "8": {
    "ErrorType": "Error-2A",
    "Error": "wrong ip address for 2A"
   },
      "3": {
    "ErrorType": "Error-2B",
    "Error": "password incorrect for 2B"
   }
},
  "details3": {
   "1": {
    "ErrorType": "Error-3A",
    "Error": "wrong ip address for 3A"
   },
      "5": {
    "ErrorType": "Error-3B",
    "Error": "password incorrect for 3B"
   }
}
}

请注意,我想在最终回复中添加 3 个新键 - details1details2details3。 我也想取出SERVER_COUNT的值,做成key。

我已经添加了以下代码,但不确定是否更新它以获得最终所需的 json

let finalData = Object.assign({}, ...data1.map(({
  SERVER_COUNT,
  ...rest
}) => ({
  [SERVER_COUNT]: rest
})));

注意:只有 3 个主键,它们是硬编码的 details1details2details13

【问题讨论】:

  • 预期输出无效
  • 另外,这不是 JSON,这些是包含对象的数组。
  • 想要的结果应该是一个对象,而不是一个数组。
  • 不,你没有。当它应该是{}时,它周围仍然有[]
  • 对不起。现已添加。

标签: javascript node.js json collections hashmap


【解决方案1】:

循环遍历数组元素,使用SERVER_COUNT 属性作为键将每个元素转换为对象属性。

function dataToDetails (data) {
  let result = {};
  data.forEach(({ErrorType, Error, SERVER_COUNT}) => result[SERVER_COUNT] = {ErrorType, Error});
  return result;
}

const data1 =
[
  {
    "ErrorType": "Error-1A",
    "Error": "wrong ip address for 1A",
    "SERVER_COUNT": 9
  },
  {
    "ErrorType": "Error-1B",
    "Error": "password incorrect for 1B",
    "SERVER_COUNT": 2
  },

];

const data2 = 
[
  {
    "ErrorType": "Error-2A",
    "Error": "wrong data for 2A",
    "SERVER_COUNT": 8
  },
  {
    "ErrorType": "Error-2B",
    "Error": "password incorrect for 2B",
    "SERVER_COUNT": 3
  },

];

const data3 = 
[
  {
    "ErrorType": "Error-3A",
    "Error": "wrong data for 3A",
    "SERVER_COUNT": 1
  },
  {
    "ErrorType": "Error-3B",
    "Error": "password incorrect for 3C",
    "SERVER_COUNT": 5
  },

];


let finalData = {
  details1: dataToDetails(data1),
  details2: dataToDetails(data2),
  details3: dataToDetails(data3)
};

console.log(finalData);

【讨论】:

  • 我的情况是 SERVER_COUNT 具有相同的值,在这种情况下它没有显示所有 ErrorType 值
  • const data1 = [ { "ErrorType": "Error-1A", "Error": "wrong ip address for 1A", "SERVER_COUNT": 9 }, { "ErrorType": "Error-1B", "Error": "password incorrect for 1B", "SERVER_COUNT": 9 }, ];
  • 对象键必须是唯一的。在这种情况下,您期望结果是什么?
  • { "details1": { "9": { "ErrorType": "Error-1A", "Error": "wrong ip address for 1A" }, "9": { "ErrorType": "Error-1B", "Error": "password incorrect for 1B" } }, ...
  • 听起来您需要修改您的设计以允许键的值是对象数组而不是单个对象。
【解决方案2】:

您可以将所有数据数组放入一个名为all_data 的数组中,然后您可以使用.map() 形成一个[detailsN, object] 条目数组。这里detailsN 代表您的外部对象的键,对象代表每个详细键的对象。将 all_data 映射到条目后,可以使用 Object.fromEntries() 将其转换为对象。

整体的对象组件可以通过将每个数据数组中的数据映射到[SERVER_COUNT, obj]条目来形成,然后您可以调用 Object.fromEntries() 将映射的条目数组转换为对象。

const data1 = [ { "ErrorType": "Error-1A", "Error": "wrong ip address for 1A", "SERVER_COUNT": 9 }, { "ErrorType": "Error-1B", "Error": "password incorrect for 1B", "SERVER_COUNT": 2 }, ];
const data2 = [ { "ErrorType": "Error-2A", "Error": "wrong data for 2A", "SERVER_COUNT": 8 }, { "ErrorType": "Error-2B", "Error": "password incorrect for 2B", "SERVER_COUNT": 3 }, ];
const data3 = [ { "ErrorType": "Error-3A", "Error": "wrong data for 3A", "SERVER_COUNT": 1 }, { "ErrorType": "Error-3B", "Error": "password incorrect for 3C", "SERVER_COUNT": 5 }, ];

const keys = ["details1", "details2", "details3"];
const all_data = [data1, data2, data3];
const res = Object.fromEntries(all_data.map((data, i) => [
  keys[i], 
  Object.fromEntries(data.map(({SERVER_COUNT, ...r}) => [SERVER_COUNT, r]))
]));
console.log(res);

【讨论】:

    【解决方案3】:

    JS 伪代码:.

    1. 将所有 joson 解析为对象
    2. Object.assigne 或 {...obj1, ...objt2};
    3. 对象转json
    const data1 =
    [
      {
        "ErrorType": "Error-1A",
        "Error": "wrong ip address for 1A",
        "SERVER_COUNT": 9
      },
      {
        "ErrorType": "Error-1B",
        "Error": "password incorrect for 1B",
        "SERVER_COUNT": 2
      }
    ]
    
    const data2 = 
    [
      {
        "ErrorType": "Error-2A",
        "Error": "wrong data for 2A",
        "SERVER_COUNT": 8
      },
      {
        "ErrorType": "Error-2B",
        "Error": "password incorrect for 2B",
        "SERVER_COUNT": 3
      }
    ]
    
    const data3 = 
    [
      {
        "ErrorType": "Error-3A",
        "Error": "wrong data for 3A",
        "SERVER_COUNT": 1
      },
      {
        "ErrorType": "Error-3B",
        "Error": "password incorrect for 3C",
        "SERVER_COUNT": 5
      }
    ]
    
    console.log([data1, data2, data3].reduce((acc, cur, i) => Object.assign(acc, {["detailist" + i]: {...cur}}), {}))
    

    JS BIN

    【讨论】:

    • 你有很多错别字
    • 这会在哪里添加details:details2: 等键?
    • 该怎么做呢?密钥不会出现在 cur 的任何地方。
    • 如果你知道 reduce 的工作原理,以及 Object assign 的工作原理,那么显然是。您可以通过 (acc, cur) => ({...acc, ...cur}) 在 reduce 中重新使用此方法...这只是组合对象。
    【解决方案4】:

    如果您有类似 myObj={} 的对象结构,您可以添加如下键或属性:

    myObj.myKeyOrProperty = 'The data here';
    
    // or
    
    myObj.['myKeyOrProperty'] = 'The data here';
    

    您需要对 JSON 进行序列化或反序列化,以便在请求/响应中执行此操作。

    如果您有 JSON 响应,例如对象数组,请使用:

    array.push(myAwesomeObj-A);
    array.push(myAwesomeObj-B);
    array.push(myAwesomeObj-C);
    etc...
    

    当您拥有所需的数据结构时,将响应发送为:

    HTTP/1.1 200 OK
    Content-Type: application/vnd.api+json
    {
    "myDataKey": ---your data must be here in a JSON string format---
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      相关资源
      最近更新 更多