简体   繁体   English

如何在Node.js中将嵌套JSON对象的所有键值移动到父级

[英]How to move all key-values of nested JSON object to parent in Node.js

I have a JSON object with 3 nested objects at first level. 我在第一个级别具有3个嵌套对象的JSON对象。

data{"key1":"value1", "key2":"value2",
    "section1":"{"key1_1":"value1_1", "key1_2":"value1_2"}",
    "section2":"{"key2_1":"value2_1", "key2_2":"value2_2", "key2_3":"value2_3"}",
    "section3":"{"key3_1":"value3_1"}"
}

Now, using NODE.JS, I need to move all key-value from nested to parent object with all keys-values at root level, like this: 现在,使用NODE.JS,我需要将所有键值从嵌套移动到父对象,并且所有键值都位于根级别,如下所示:

data{
"key1":"value1", "key2":"value2","key1_1":"value1_1", "key1_2":"value1_2", "key2_1":"value2_1", "key2_2":"value2_2", "key2_3":"value2_3", "key3_1":"value3_1"
}

With a proper object, you could iterate the keys and if an object is found, call the function again with the content of the found object. 使用适当的对象,您可以迭代键,如果找到了对象,请使用找到的对象的内容再次调用该函数。

 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]; }); } var data = { "key1": "value1", "key2": "value2", "section1": { "key1_1": "value1_1", "key1_2": "value1_2" }, "section2": { "key2_1": "value2_1", "key2_2": "value2_2", "key2_3": "value2_3" }, "section3": { "key3_1": "value3_1" } }, flatObject = {}; flat(data, flatObject); console.log(flatObject); 

Version with JSON strings as value and a try ... catch statement for testing if the value is a JSON. 版本以JSON字符串作为值,并使用try ... catch语句测试该值是否为JSON。

 function flat(source, target) { Object.keys(source).forEach(function (k) { var o; try { o = JSON.parse(source[k]); if (o && typeof o === 'object') { flat(o, target); } else { target[k] = o; } } catch (e) { target[k] = source[k]; } }); } var data = { "key1": "value1", "key2": "value2", "section1": "{\\"key1_1\\":\\"value1_1\\", \\"key1_2\\":\\"value1_2\\"}", "section2": "{\\"key2_1\\":\\"value2_1\\", \\"key2_2\\":\\"value2_2\\", \\"key2_3\\":\\"value2_3\\"}", "section3": "{\\"key3_1\\":\\"value3_1\\"}" }, flatObject = {}; flat(data, flatObject); console.log(flatObject); 

You can recursively traverse your data and add it to an empty map: 您可以递归遍历数据并将其添加到空地图:

 var data = { "key1":"value1", "key2":"value2", "section1":{"key1_1":"value1_1", "key1_2":"value1_2"}, "section2":{"key2_1":"value2_1", "key2_2":"value2_2", "key2_3":"value2_3"}, "section3":{"key3_1":"value3_1"} } var fill = function(carry, obj) { for (var key in obj) { if (!obj.hasOwnProperty(key)) { continue; } if (obj[key] instanceof Object) { fill(carry, obj[key]); } else { carry[key] = obj[key]; } } return carry; } var output = {} fill(output, data); console.log(output); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM