仅展平嵌套 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);
我的 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);