欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

替換json對象中的key最佳方案

 更新時間:2021年06月01日 17:22:40   作者:Jaxu  
本文給大家介紹如何替換json對象中的key,通過實例代碼給大家介紹key的替換方法,代碼也很簡單,需要的朋友參考下吧

JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數(shù)據(jù)交換格式。它基于 ECMAScript (歐洲計算機(jī)協(xié)會制定的js規(guī)范)的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)。簡潔和清晰的層次結(jié)構(gòu)使得 JSON 成為理想的數(shù)據(jù)交換語言。 易于人閱讀和編寫,同時也易于機(jī)器解析和生成,并有效地提升網(wǎng)絡(luò)傳輸效率。

  看到標(biāo)題你可能會想,如此簡單的問題值得去探究嗎?如果我有一個json object,只需下面簡單的幾行代碼就可以完成:

var obj = {
    "_id": "5078c3a803ff4197dc81fbfb",
    "email": "user1@gmail.com",
    "image": "some_image_url",
    "name": "Name 1"
};

var new_key = "id";
var old_key = "_id";

obj[new_key] = obj[old_key];
delete obj[old_key];

  是的,沒錯!以上代碼可以很好地完成工作,從而將obj對象中的"_id"替換成"id"。

  在大多數(shù)情況下,這種方式不會帶來什么問題,但是,如果你需要將obj對象序列化到文檔中并比較差異,你就會看到問題。

// 修改之前的obj
{
    "_id": "5078c3a803ff4197dc81fbfb",
    "email": "user1@gmail.com",
    "image": "some_image_url",
    "name": "Name 1"
}

// 修改之后的obj 
// JSON.stringify(obj, null, "\t")
{
    "email": "user1@gmail.com",
    "image": "some_image_url",
    "name": "Name 1",
    "id": "5078c3a803ff4197dc81fbfb"
}

  新添加的key默認(rèn)放在了最后,并且由于在替換過程中我們刪除了之前的key,所以導(dǎo)致序列化之后的obj與之前的obj存在較大的差異。

  那如何才能保證在最小差異的情況下實現(xiàn)key的替換呢?下面是我找到的一些方法:

Object.prototype.renameProperty = function (oldName, newName) {
     // Do nothing if the names are the same
     if (oldName === newName) {
         return this;
     }
    // Check for the old property name to avoid a ReferenceError in strict mode.
    if (this.hasOwnProperty(oldName)) {
        this[newName] = this[oldName];
        delete this[oldName];
    }
    return this;
};
function renameKeys(obj, newKeys) {
  const keyValues = Object.keys(obj).map(key => {
    const newKey = newKeys[key] || key;
    return { [newKey]: obj[key] };
  });
  return Object.assign({}, ...keyValues);
}


const obj = { a: "1", b: "2" };
const newKeys = { a: "A", c: "C" };
const renamedObj = renameKeys(obj, newKeys);
console.log(renamedObj);
// {A:"1", b:"2"}
// 使用lodash的_.mapKeys()函數(shù)
var user = {
  name: "Andrew",
  id: 25,
  reported: false
};

var renamed = _.mapKeys(user, function(value, key) {
  return key + "_" + user.id;
});

console.log(renamed);
var str = JSON.stringify(object);
str = str.replace(/oldKey/g, 'newKey');
str = str.replace(/oldKey2/g, 'newKey2');

object = JSON.parse(str);
function renameObjectKey(oldObj, oldName, newName) {
    const newObj = {};

    Object.keys(oldObj).forEach(key => {
        const value = oldObj[key];

        if (key === oldName) {
            newObj[newName] = value;
        } else {
            newObj[key] = value;
        }
    });

    return newObj;
}
data = {key1: "value1", key2: "value2", key3: "value3"}; 

keyMap = {key1: "firstkey", key2: "secondkey", key3: "thirdkey"};

mappedData = Object.keys(keyMap).reduce((obj,k) => Object.assign(obj, { [keyMap[k]]: data[k] }),{});

console.log(mappedData);

  上面這些例子有一部分可以達(dá)到我們的要求,另外有一部分和本文開頭給出的代碼基本等效(只是在執(zhí)行效率上略有差別)。但所有這些示例無一例外都不能同時滿足下面兩個要需:

保留要替換的key在原json對象中的順序。既保證在JSON.stringify()執(zhí)行之后輸出的字符串中key的順序和原json對象是一致的。在原json對象上進(jìn)行修改,而不是返回一個新的json對象。某些情況下,我們需要對一個復(fù)雜json對象的子元素進(jìn)行修改,如果修改之后返回一個新的json對象,則無法保證這個新的對象會反應(yīng)到原json對象中。例如,jspath是一個可以通過domain-specific language (DSL)在給定的json對象中查找子元素的javascript庫,通過下面的代碼我們可以輕易地查找出obj對象中automobiles屬性中maker === "Honda"并且year > 2009的元素。

var obj = {
    "automobiles" : [
        { "maker" : "Nissan", "model" : "Teana", "year" : 2011 },
        { "maker" : "Honda", "model" : "Jazz", "year" : 2010 },
        { "maker" : "Honda", "model" : "Civic", "year" : 2007 },
        { "maker" : "Toyota", "model" : "Yaris", "year" : 2008 },
        { "maker" : "Honda", "model" : "Accord", "year" : 2011 }
    ],
    "motorcycles" : [{ "maker" : "Honda", "model" : "ST1300", "year" : 2012 }]
};

var res = JSPath.apply('.automobiles{.maker === "Honda" && .year > 2009}', obj);

// res: [{ "maker" : "Honda", "model" : "Jazz", "year" : 2010 }, { "maker" : "Honda", "model" : "Accord", "year" : 2011 }]

  注意這里返回的res對象是obj對象的一部分,意味著后續(xù)對res對象所做的任何修改都會反應(yīng)到obj對象中。如果我們對res中的某些key進(jìn)行替換,而返回一個新json對象的話,那么這個修改就不會反應(yīng)到obj對象中。

  基本思路:既然新添加的key默認(rèn)都會排在最后,那么索性遍歷json對象的所有key,然后將key一一替換為一個臨時名稱,隨后再將這個臨時名稱替換回來。在這個過程中,如果遇到真正需要替換的key,則不再進(jìn)行二次替換。下面是具體的代碼:

var obj = {
    "_id": "5078c3a803ff4197dc81fbfb",
    "email": "user1@gmail.com",
    "image": "some_image_url",
    "name": "Name 1"
};

var new_key = "id";
var old_key = "_id";

Object.keys(obj).forEach(key => {
    if (key === old_key) {
        obj[new_key] = obj[key];
        delete obj[key];
    } else {
        obj[`_${key}`] = obj[key];
        delete obj[key];

        obj[`${key}`] = obj[`_${key}`];
        delete obj[`_${key}`];
    }
});

  完成之后的效果如下圖:

  當(dāng)然,如果考慮通用性,可能需要遞歸遍歷給定的json對象。以上代碼只是給出了一個思路,考慮到執(zhí)行效率和安全性,這個并不是最佳方案,真實使用中我們可以逐步進(jìn)行完善。

以上就是替換json對象中的key最佳方案的詳細(xì)內(nèi)容,更多關(guān)于替換json對象中的key的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Js動態(tài)創(chuàng)建div

    Js動態(tài)創(chuàng)建div

    因為功能需要,需要動態(tài)創(chuàng)建DIV
    2008-09-09
  • JS中with的替代方法與String中的正則方法詳解

    JS中with的替代方法與String中的正則方法詳解

    最近這幾天在升級自己的MVVM 框架,遇到很多小問題,所以想著就在這里統(tǒng)一解決了。文中主要介紹了關(guān)于Javascript中with的替代方法與String中的正則方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • tsc性能優(yōu)化Project References使用詳解

    tsc性能優(yōu)化Project References使用詳解

    這篇文章主要為大家介紹了tsc性能優(yōu)化Project References使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 詳解JavaScript閉包的優(yōu)缺點和作用

    詳解JavaScript閉包的優(yōu)缺點和作用

    閉包是指在 JavaScript 中,內(nèi)部函數(shù)可以訪問其外部函數(shù)作用域中的變量,即使外部函數(shù)已經(jīng)執(zhí)行完畢,這種特性被稱為閉包,本文將給大家介紹一下JavaScript閉包的優(yōu)缺點和作用,需要的朋友可以參考下
    2023-09-09
  • 基于原生js淡入淡出函數(shù)封裝(兼容IE)

    基于原生js淡入淡出函數(shù)封裝(兼容IE)

    這篇文章主要為大家詳細(xì)介紹了基于原生js淡入淡出函數(shù)封裝,可兼容IE,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • JS鍵盤版計算器的制作方法

    JS鍵盤版計算器的制作方法

    這篇文章主要為大家詳細(xì)介紹了JS鍵盤版計算器的制作方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 微信小程序版本機(jī)制和storage如何平滑兼容詳解

    微信小程序版本機(jī)制和storage如何平滑兼容詳解

    這篇文章主要給大家介紹了關(guān)于微信小程序版本機(jī)制和storage如何平滑兼容的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-12-12
  • JavaScript實現(xiàn)梯形乘法表的方法

    JavaScript實現(xiàn)梯形乘法表的方法

    這篇文章主要介紹了JavaScript實現(xiàn)梯形乘法表的方法,涉及基本javascript結(jié)合表格操作的技巧,需要的朋友可以參考下
    2015-04-04
  • 百度地圖JavascriptApi Marker平滑移動及車頭指向行徑方向

    百度地圖JavascriptApi Marker平滑移動及車頭指向行徑方向

    本文主要介紹了百度地圖JavascriptApi Marker平滑移動及車頭指向行徑方向的相關(guān)知識。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • JavaScript前后端JSON使用方法教程

    JavaScript前后端JSON使用方法教程

    這篇文章主要給大家介紹了關(guān)于JavaScript前后端JSON使用方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評論