簡體   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