如何修改 JSON 响应数组以在 NodeJS 中添加新键?

How to modify JSON response array to add new keys in NodeJS?

我有一个返回以下 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

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

您可以将所有数据数组放入一个名为 all_data 的数组中,然后您可以使用 .map() on to form an array of [detailsN, object] entries. Here detailsN represents your key for your outer object and the object represents the object for each detail key. Once you have mapped your all_data to entries, you can use 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);

遍历数组元素,使用 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);

如果您有像 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---
}