仅展平嵌套 JSON 第二级

Flatten nested JSON second level only

我的 JSON 结构如下

var data = var data = [{"id": 451, "title": {    "rendered": "title1" }, "acf": {    "floor": "6",    "business": [       "business"    ],    "status": {       "value": "null",       "label": "Määramata"    },    "suund": "",    "area": {       "value": "full",       "label": "Terve korrus"       },       "suurus": "",       "tookohad": "",    }, },]; 

我需要将 acf 展平以在没有 acf 嵌套的情况下得到它。

var data = [
  {
"id": 451,
"title": {
   "rendered": "Title 1"
},
   "floor": "6",
   "business": [
      "business"
   ],
   "status": {
      "value": "null",
      "label": "Määramata"
   },
   "suund": "",
   "area": {
      "value": "full",
      "label": "Full"
      },
      "size": "",
},
];

我试过使用这个功能

function flat(source, target) {
Object.keys(source).forEach(function (k) {
    if (source[k]!== null && typeof source[k] === 'object') {
        flat(source[k], target);
        return;
    }
    target[k] = source[k];
});flatObject = {};flat(data, flatObject);console.log(flatObject);

但它把一切都压平了。我需要从 acf 中挑选东西,但将带有 id 的元素分开。

您可以执行以下操作:

const flattenData = {
  ...data,
  acf: undefined,
  ...data.acf
};
delete flattenData['acf'];

此方法链接一些 destructuring assignments。首先 - ...data - 我们复制第一层的所有数据。然后在新对象中我们用 undefined 覆盖 acf。这减少了内存占用。最后我们 overwrite/copy data.acf 的完整对象,从而按照你想要的方式展平数组。

如果您可以接受数组中的 acf: undefined,您可以删除 delete flattenData['acf'] 并使其更快一些。

据我了解,您想要实现的是: (我改进了这个例子,这样你甚至可以在一个对象数组上工作)

var data = [{"id": 451, "title": {    "rendered": "title1" }, "acf": {    "floor": "6",    "business": [       "business"    ],    "status": {       "value": "null",       "label": "Määramata"    },    "suund": "",    "area": {       "value": "full",       "label": "Terve korrus"       },       "suurus": "",       "tookohad": "",    }, },]; 

function flat(source) {
  let result = source.map(el => {
    let noAcf = {}
    Object.keys(el).forEach(key => {
      if(key === "acf"){
        noAcf = {...noAcf, ...el[key]}
      } else {
        noAcf[key]=el[key]
      }
    })
    return noAcf
  })
  return result
}


const flatObjectsList = flat(data);
console.log(flatObjectsList);