JS-将JSON的嵌套数组转换为单个对象

时间:2020-08-28 09:10:34

标签: javascript json

我想将嵌套的JSON结构转换为单个对象,并使用我在下面的代码中尝试过的动态键,但是它只能在一个级别上使用,我需要编写一些递归函数,而我正努力为此编写代码n级嵌套JSON。请告知。

   data.map((e) => {
   for (let key in e) {
     if (typeof e[key] === "object") {
       for (let onLevel in e[key]) {
         e[key + "." + onLevel] = e[key][onLevel];
       }
     }
   }
 });

示例

输入JSON

[{
  "Id": "0hb3L00000000jkQAA",
  "Name": "P-2797",
  "ContactEncounterId": "0ha3L000000001qQAA",
  "StartTime": "2020-06-27T11:00:00.000Z",
  "EncounterDuration": 25,
  "ContactEncounter": {
    "Name": "Grocery Shopping 17",
    "LocationId": "1313L0000004ENlQAM",
    "Id": "0ha3L000000001qQAA",
    "Location": {
      "Name": "Waitrose",
      "LocationType": "Site",
      "Id": "1313L0000004ENlQAM"
    }
  }
}]

OutPut JSON

[{
  "Id": "0hb3L00000000jkQAA",
  "Name": "P-2797",
  "ContactEncounterId": "0ha3L000000001qQAA",
  "StartTime": "2020-06-27T11:00:00.000Z",
  "EncounterDuration": 25,
  "ContactEncounter.Name": "Grocery Shopping 17",
  "ContactEncounter.LocationId": "1313L0000004ENlQAM",
  "ContactEncounter.Id": "0ha3L000000001qQAA",
  "ContactEncounter.Location.Name": "Waitrose",
  "ContactEncounter.Location.LocationType": "Site",
  "ContactEncounter.Location.Id": "1313L0000004ENlQAM"
}]

2 个答案:

答案 0 :(得分:2)

正如您所说,您需要创建一个递归以更深入地了解对象。也就是说,您必须跟踪自己所在的路径。

您可以通过以下方式解决

InvalidRegionError: Provided region_name 'region: us-east-1' doesn't match a supported format.

或者通过以下方式,您只需使用const input = [{ "Id": "0hb3L00000000jkQAA", "Name": "P-2797", "ContactEncounterId": "0ha3L000000001qQAA", "StartTime": "2020-06-27T11:00:00.000Z", "EncounterDuration": 25, "ContactEncounter": { "Name": "Grocery Shopping 17", "LocationId": "1313L0000004ENlQAM", "Id": "0ha3L000000001qQAA", "Location": { "Name": "Waitrose", "LocationType": "Site", "Id": "1313L0000004ENlQAM" } } } ]; function merge( source, target = {}, ...parents) { for (let [key, value] of Object.entries( source ) ) { const path = (parents || []).concat( key ); if (typeof value === 'object') { merge( value, target, ...path ); continue; } target[path.join('.')] = value; } return target; } console.log( merge( input[0] ) );将更深入的搜索结果分配给当前对象。

Object.assign

答案 1 :(得分:-1)

这是另一种方法,通过使用第二个参数并在找到第n级对象时传递键。

const obj = {
  "Id": "0hb3L00000000jkQAA",
  "Name": "P-2797",
  "ContactEncounterId": "0ha3L000000001qQAA",
  "StartTime": "2020-06-27T11:00:00.000Z",
  "EncounterDuration": 25,
  "ContactEncounter": {
    "Name": "Grocery Shopping 17",
    "LocationId": "1313L0000004ENlQAM",
    "Id": "0ha3L000000001qQAA",
    "Location": {
      "Name": "Waitrose",
      "LocationType": "Site",
      "Id": "1313L0000004ENlQAM"
    }
  }
}


function flattenObj(obj, param) {
  let newObj = {};
  for (let key in obj) {
    if (typeof obj[key] === 'object') {
      newObj = { ...newObj,
        ...flattenObj(obj[key], key + '.')
      }
    } else {
      newObj[param + key] = obj[key]
    }
  }
  return newObj;
}


console.log(flattenObj(obj, ''))