繁体   English   中英

重命名嵌套的 object 个键

[英]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.Typeselection.Typeitem_Typeselection_Type

这就是我要使用的:

var json = jsonFromExampleAbove;
str = JSON.stringify(json);
str = str.selectionFile.replace(/\".\":/g, "\"_\":");
json = JSON.parse(str);
console.log(json);

我收到控制台日志错误。 我认为这是因为我试图替换的值是嵌套的,但不确定。 我在这里仍然是一个初学者。

谢谢。

我很想使用Object.entriesObject.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.

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