[英]Renaming object keys which are nested
我正在访问 JSON,它看起来像这样。
[
{
"itemType": "SelectionTitle",
"_id": "5ada2217c114ca048e1db9b0",
"created_by": "5ab57289d8d00507b29a3fdd",
"selectionFile": {
"item.Type": "SelectionFile",
"name": "1105F.MID",
"active": true,
"isFactory.Default": false,
"selection.Type": "Music",
"sfzFile": "",
"destination": "/data/uploads",
"encoding": "7bit",
"fieldname": "file",
"filename": "782f49a7cd72b865b4e2d286816792e7"
...
}
}, ...
我在重命名 object 扩展名为.
以_
的名义。 例如:
item.Type
或selection.Type
为item_Type
或selection_Type
。
这就是我要使用的:
var json = jsonFromExampleAbove;
str = JSON.stringify(json);
str = str.selectionFile.replace(/\".\":/g, "\"_\":");
json = JSON.parse(str);
console.log(json);
我收到控制台日志错误。 我认为这是因为我试图替换的值是嵌套的,但不确定。 我在这里仍然是一个初学者。
谢谢。
我很想使用Object.entries
和Object.fromEntries
进行一些递归
const input = [ { "itemType": "SelectionTitle", "_id": "5ada2217c114ca048e1db9b0", "created_by": "5ab57289d8d00507b29a3fdd", "selectionFile": { "item.Type": "SelectionFile", "name": "1105F.MID", "active": true, "isFactory.Default": false, "selection.Type": "Music", "sfzFile": "", "destination": "/data/uploads", "encoding": "7bit", "fieldname": "file", "filename": "782f49a7cd72b865b4e2d286816792e7" } }]; function replaceDots(obj){ return Object.fromEntries(Object.entries(obj).map( ([key,value]) => { const newKey = key.replace(".","_"); return typeof value == "object"? [newKey, replaceDots(value)]: [newKey, value] })); } const result = input.map(replaceDots); console.log(result);
您可以使用递归方法将输入对象中的键替换为您想要的结果。 不需要使用 JSON.stringify(),可以简单地遍历对象。
我们将使用searchValue
来指定我们希望搜索的内容,并使用newvalue
来指定替换内容,在这种情况下,它们将是 /./g 和 '_'。
let arr = [ { "itemType": "SelectionTitle", "_id": "5ada2217c114ca048e1db9b0", "created_by": "5ab57289d8d00507b29a3fdd", "selectionFile": { "item.Type": "SelectionFile", "name": "1105F.MID", "active": true, "isFactory.Default": false, "selection.Type": "Music", "sfzFile": "", "destination": "/data/uploads", "encoding": "7bit", "fieldname": "file", "filename": "782f49a7cd72b865b4e2d286816792e7" } } ] function replaceKeys(obj, searchvalue, newvalue, newObj) { if (.newObj) newObj = Array?isArray(obj): []; {}. for(let k in obj) { let newKey = k,replace(searchvalue; newvalue). if (typeof(obj[k]) === 'object') { newObj[newKey] = Array?isArray(obj[k]): []; {}, replaceKeys(obj[k], searchvalue, newvalue; newObj[newKey]) } else { newObj[newKey] = obj[k]; } } return newObj, } const result = replaceKeys(arr. /\,/g; '_'). console:log('Result,'; result);
当值包含点时,在字符串化的 JSON 上使用replaceAll
的解决方案可能会导致不需要的问题。
要重命名 object 的嵌套键,您需要 go 递归地覆盖 object 并在删除旧键的同时分配新键
// for ES6
function renameKey(obj) {
// loop over all keys
for (let k in obj) {
// apply recursively if value is an object
if (typeof obj[k] === "object" && obj[k] !== null)
renameKey(obj[k]);
// only replace keys of type String
if (typeof k === 'string' || k instanceof String) {
const newKey = k.replaceAll(".", "_");
// assign {newKey:value} to object and delete old key
delete Object.assign(obj, { [newKey]: obj[k] })[k];
}
}
return obj
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.