JSONオブジェクトのキーを置き換える最良の方法

JSONオブジェクトのキーを置き換える最良の方法

JSON (JavaScript Object Notation、JS Object Notation) は軽量のデータ交換形式です。これは、ECMAScript (欧州コンピュータ協会によって開発された js 仕様) のサブセットに基づいており、プログラミング言語から完全に独立したテキスト形式を使用してデータを保存および表現します。シンプルさと明確な階層構造により、JSON は理想的なデータ交換言語となっています。 人間にとって読み書きが容易であり、機械にとっても解析や生成が容易であり、ネットワーク伝送効率を効果的に向上させることができます。

タイトルを見ると、このような単純な質問に検討する価値があるのだろうかと疑問に思うかもしれません。 json オブジェクトがあれば、数行のコードで実行できます。

var obj = {
    "_id": "5078c3a803ff4197dc81fbfb",
    「メール」: 「[email protected]」、
    "画像": "some_image_url",
    "name": "名前 1"
};

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

obj[新しいキー] = obj[古いキー];
obj[old_key]を削除します。

はい、その通りです!上記のコードは、obj オブジェクト内の "_id" を "id" に置き換えて、問題なく機能します。

ほとんどの場合、この方法で問題は発生しませんが、obj オブジェクトをドキュメントにシリアル化して差異を比較する必要がある場合は、問題が発生します。

// 前のオブジェクトを変更する
{
    "_id": "5078c3a803ff4197dc81fbfb",
    「メール」: 「[email protected]」、
    "画像": "some_image_url",
    "name": "名前 1"
}

// 変更後のオブジェクト 
// JSON.stringify(obj, null, "\t")
{
    「メール」: 「[email protected]」、
    "画像": "some_image_url",
    "name": "名前 1",
    "id": "5078c3a803ff4197dc81fbfb"
}

新しく追加されたキーはデフォルトで最後に配置され、置換プロセス中に以前のキーを削除したため、シリアル化後の obj は以前の obj と大きく異なります。

では、キーの交換が最小限の違いで実現されるようにするにはどうすればよいでしょうか?私が見つけたいくつかの方法は次のとおりです:

Object.prototype.renameProperty = 関数 (oldName, newName) {
     // 名前が同じ場合は何もしない
     (古い名前 === 新しい名前) の場合 {
         これを返します。
     }
    // 厳密モードで ReferenceError を回避するために、古いプロパティ名を確認します。
    if (this.hasOwnProperty(oldName)) {
        this[新しい名前] = this[古い名前];
        this[oldName]を削除します。
    }
    これを返します。
};
関数 renameKeys(obj, newKeys) {
  const keyValues ​​= Object.keys(obj).map(key => {
    const newKey = newKeys[キー] || キー;
    戻り値: [newKey]: obj[key] };
  });
  Object.assign({}, ...keyValues) を返します。
}


定数obj = { a: "1", b: "2" };
const newKeys = { a: "A", c: "C" };
定数 renamedObj = renameKeys(obj, newKeys);
コンソールログ(名前が変更されたObj);
// {A:"1", b:"2"}
// lodash の _.mapKeys() 関数を使用する var user = {
  名前:「アンドリュー」
  id: 25,
  報告: 誤り
};

var renamed = _.mapKeys(user, function(value, key) {
  リターンキー + "_" + user.id;
});

console.log(名前変更);
var str = JSON.stringify(オブジェクト);
str = str.replace(/oldKey/g, 'newKey');
str = str.replace(/oldKey2/g, 'newKey2');

オブジェクト = JSON.parse(str);
関数 renameObjectKey(oldObj, oldName, newName) {
    定数 newObj = {};

    Object.keys(oldObj).forEach(キー => {
        定数値 = oldObj[キー];

        if (キー === oldName) {
            newObj[新しい名前] = 値;
        } それ以外 {
            newObj[キー] = 値;
        }
    });

    新しいオブジェクトを返します。
}
データ = {key1: "値1"、key2: "値2"、key3: "値3"}; 

keyMap = {key1: "最初のキー"、key2: "2番目のキー"、key3: "3番目のキー"};

マップされたデータ = Object.keys(keyMap).reduce((obj,k) => Object.assign(obj, { [keyMap[k]]: data[k] }),{});

コンソールにログ出力します。

上記の例のいくつかは要件を満たすことができ、そのうちのいくつかは基本的にこの記事の冒頭に示したコードと同等です (実行効率にわずかな違いがあるだけです)。しかし、これらの例はすべて、例外なく、次の 2 つの要件を同時に満たしていません。

元の JSON オブジェクトで置換するキーの順序を維持します。これにより、JSON.stringify() の実行後に出力される文字列内のキーの順序が元の JSON オブジェクトと一致するようになります。新しい JSON オブジェクトを返す代わりに、元の JSON オブジェクトを変更します。場合によっては、複雑な JSON オブジェクトのサブ要素を変更する必要があります。変更後に新しい JSON オブジェクトが返された場合、新しいオブジェクトが元の JSON オブジェクトに反映される保証はありません。たとえば、jspath は、ドメイン固有言語 (DSL) を通じて特定の json オブジェクト内の子要素を検索できる JavaScript ライブラリです。次のコードを使用すると、obj オブジェクトの automobiles プロパティ内で、maker === "Honda" かつ year > 2009 である要素を簡単に見つけることができます。

var obj = {
    「自動車」: [
        { "メーカー" : "日産", "モデル" : "ティアナ", "年式" : 2011 },
        { "メーカー" : "ホンダ", "モデル" : "ジャズ", "年式" : 2010 },
        { "メーカー" : "ホンダ", "モデル" : "シビック", "年式" : 2007 },
        { "メーカー" : "トヨタ", "モデル" : "ヤリス", "年式" : 2008 },
        { "メーカー" : "ホンダ", "モデル" : "アコード", "年式" : 2011 }
    ]、
    「オートバイ」: [{「メーカー」:「ホンダ」、 「モデル」:「ST1300」、 「年式」:2012 }]
};

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

// res: [{ "メーカー" : "ホンダ", "モデル" : "ジャズ", "年式" : 2010 }, { "メーカー" : "ホンダ", "モデル" : "アコード", "年式" : 2011 }]

ここで返される res オブジェクトは obj オブジェクトの一部であることに注意してください。つまり、res オブジェクトに対してその後行われた変更は obj オブジェクトに反映されます。 res 内のいくつかのキーを置き換えて新しい json オブジェクトを返すと、この変更は obj オブジェクトに反映されません。

基本的な考え方: 新しく追加されたキーはデフォルトで最後にランク付けされるため、JSON オブジェクトのすべてのキーを走査し、キーを 1 つずつ一時的な名前に置き換えてから、一時的な名前を元に戻します。このプロセス中に、実際に置換する必要があるキーが見つかった場合、二次置換は実行されません。具体的なコードは次のとおりです。

var obj = {
    "_id": "5078c3a803ff4197dc81fbfb",
    「メール」: 「[email protected]」、
    "画像": "some_image_url",
    "name": "名前 1"
};

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

Object.keys(obj).forEach(キー => {
    if (キー === 古いキー) {
        obj[新しいキー] = obj[キー];
        obj[キー]を削除します。
    } それ以外 {
        obj[`_${key}`] = obj[key];
        obj[キー]を削除します。

        obj[`${key}`] = obj[`_${key}`];
        obj[`_${key}`]を削除します。
    }
});

完成した効果は次のようになります。

もちろん、普遍性を考慮すると、指定された JSON オブジェクトを再帰的に走査する必要があるかもしれません。上記のコードはあくまでもアイデアを示すものです。実行効率とセキュリティを考慮すると、これは最善の解決策ではありません。実際の使用では徐々に改善することができます。

上記は、JSON オブジェクト内のキーを置き換えるための最適なソリューションの詳細です。JSON オブジェクト内のキーを置き換える方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • C# 動的キーを持つ JSON オブジェクトの値を取得する例
  • jsonオブジェクトのキーと値を操作するJSの一般的なメソッドの分析
  • JavaScriptはjsonオブジェクトのキーとjsオブジェクトの属性インスタンスを走査します。
  • json オブジェクトのすべてのキーをトラバースし、js の動的キーに従って値を取得する方法 (必読)
  • JSはキー値に応じてURL内のパラメータ値を取得し、URLパラメータをjsonオブジェクトに変換します。
  • C#は、json形式をオブジェクトに変換し、キーを変更するメソッドを実装します。

<<:  mysql8でルートユーザーのパスワードをリセットする手順を完了します

>>:  Zabbix で Windows のパフォーマンスを監視する方法

推薦する

CocosCreator Huarongdaoデジタルパズルの詳しい説明

目次序文文章1. パネル2. 華容島ソリューション3. コード4. 注記序文華容路とは何ですか? 誰...

MAC 上の MySQL の初期パスワードを忘れた場合の対処方法

MACでMySQLの初期パスワードを忘れた問題を解決する方法を参考までに共有します。具体的な内容は次...

知っておくべき JS 配列削減の高度な使い方 25 選

序文Reduce は ES5 で追加された新しい従来の配列メソッドの 1 つです。forEach、f...

CSS3で線形グラデーションを実装するためのコードの詳細な説明

序文デモでは古いバージョンのブラウザのグラデーションが実装されています[IE9-]。 IE9 より前...

Vite と Vue CLI の長所と短所

Vue エコシステムには Vite と呼ばれる新しいビルド ツールがあり、Vue CLI よりも 1...

CSSはマウスが画像に移動したときにマスク効果を実現します

1.マスクレイヤーのHTMLコードと画像をdivに配置する.img_div に入れました。 <...

CentOS6で定期的にjarプログラムを実行するスクリプトをcrontabで実行する

1. 簡単なJavaプログラムを書く パブリッククラステストシェル{ パブリック静的voidメイン(...

MySQL 作成ルーチン権限に関する注意事項

1. ユーザーにルーチン作成権限がある場合は、プロシージャ | 関数を作成できます。 2. ユーザー...

VMware 仮想マシン ubuntu18.04 インストール チュートリアル

インストール手順1. 仮想マシンを作成する 2. [カスタム(詳細)]を選択し、[次へ]をクリックし...

MySQL マスター スレーブ データベースが同期されない問題を解決する 2 つの方法

目次MySQL マスター スレーブ データベースが同期されない問題を解決する 2 つの方法1. 非同...

DockerでLinuxシェルコマンドを実行する方法

Docker でシェル コマンドを実行するには、コマンドの前に sh -c を追加する必要があります...

Centos8.3、dockerデプロイメントspringbootプロジェクトの実際のケース分析

導入現在、k8s は非常に人気があり、それについて学ぶために本を購入しました。しかし、k8s では数...

1つの記事でJSONPの原理と応用を理解する

目次JSONPとはJSONP 原則JSONP実装1. Ajaxでクロスドメインリクエストが行われると...

MySQL データベース設計 3 つのパラダイム例分析

3つのパラダイム1NF: フィールドは分離不可能です。 2NF: 主キーがあり、非主キー フィールド...

MySQLの浅いエントリと深いエグジットの原則についての簡単な説明

目次1. ページの概要2. 下限と上限3. ページディレクトリを使用する4. ページの実際の外観4....