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 のパフォーマンスを監視する方法

推薦する

Docker Compose ネットワーク設定の説明

基本概念デフォルトでは、Compose はアプリケーション用のネットワークを作成し、サービスの各コン...

IDEA は Docker プラグインを使用します (初心者向けチュートリアル)

目次例示する1. Dockerリモートアクセスを有効にする2. Dockerに接続する3. イメージ...

MySQL 8.0.20 Window10無料インストール版設定とNavicat管理チュートリアルグラフィック詳細説明

1. MySQL 8.0.20をダウンロードして解凍するダウンロードリンク: https://dev...

React は antd のアップロード コンポーネントを使用してファイル フォーム送信機能を実装します (完全なコード)

私はプロジェクトを実行するために react を使い始めたばかりで、非常に未熟で完全な初心者です。私...

Node.js+expressメッセージボード機能実装例

目次メッセージボード必要なライブラリオープンソースプロジェクトプロジェクト構造メッセージボードnod...

Windows Server 2019 で NAS を構成する方法

序文このチュートリアルでは最新バージョンをインストールします。 NAS は非常に安定して動作するので...

Nodejs で WeChat アカウント分割を実装するためのサンプルコード

会社のビジネスシナリオでは、WeChat アカウント分割機能を使用する必要があります。公式 Web ...

Linux でユーザー アカウントをロックおよびロック解除する 3 つの方法

組織内で何らかのパスワード ポリシーがすでに実装されている場合は、この記事を読む必要はありません。た...

MySQL がデータの削除と挿入に非常に時間がかかる問題の解決策

会社の開発者がテスト環境で挿入ステートメントを実行すると、正常に実行されるまでに 10 秒以上かかり...

インライン要素スパンの最小高さの定義

span タグは HTML ウェブページを作成するときによく使用されますが、このタグの使い方がよくわ...

CentOS6 アップグレード glibc 操作手順

目次背景glibc 2.14をコンパイルするソフトリンクを変更するやっと背景テスト環境には Cent...

MySQLリモート接続権限の詳細な説明

1. MySQLデータベースにログインするmysql -u ルート -pユーザーテーブルを表示する ...

Tomcat セキュリティ仕様 (Tomcat セキュリティ強化と仕様)

tomcat はオープンソースの Web サーバーです。Tomcat ベースの Web は実行効率...

フォームタグの Enctype 属性とその応用例の紹介

Enctype : ブラウザがデータをサーバーに送り返すときに使用するエンコーディングのタイプを指定...

MySQL 起動時に報告される ERROR:2002 の分析と解決方法

序文この記事は主にMySQL起動エラー2002の分析と解決方法を紹介しています。参考と勉強のために共...