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

推薦する

js でパズルゲームを実装する

この記事では、パズルゲームを実装するためのjsの具体的なコードを参考までに共有します。具体的な内容は...

Webpack での publicPath の使用法の詳細な説明

目次出力出力パス出力.publicPath webpack-dev-server の publicP...

MySQLでカンマ区切り値の列を列に変換する方法

序文場合によっては、第 1 正規形設計パターンに従わないビジネス テーブルに遭遇することがあります。...

純粋な CSS でマークダウンの自動番号付けを実装するサンプル コード

問題の起源私がタイトルの番号付けの問題に初めて注目したのは、学部の論文を書いていた頃まで遡ります。当...

jsはタイトルと説明のキーワードを検出し、見つかった場合は置換するか他のページにジャンプします。

キーワード 一般タイトルには、クラック、キー、シリアル番号、キージェネレータなどの単語を含めることは...

コードレイン効果を実現するJavaScriptキャンバス

この記事では、コードレイン効果を実現するためのキャンバスの具体的なコードを参考までに共有します。具体...

Baota Linux パネル コマンド リスト

目次Pagodaをインストールする管理塔Nginx サービス管理Apache サービス管理MySQL...

初心者がソースコードからMySQLのデッドロック問題を理解する

夜遅くまで何度も困難なシングルステップデバッグを行った後、ようやく理想的なブレークポイントを見つけま...

Linux サーバーのクイックアンインストールとノード環境のインストール (簡単に始められます)

1.まずnpmをアンインストールする sudo npm アンインストール npm -g 2. ノー...

Vueルーティング相対パスジャンプメソッド

目次Vueルーティング相対パスジャンプ1. 属性の追加2.router.resolveメソッドVue...

MySQLで負荷分散を実装する方法

序文MySQL は、クライアント/サーバー構造に基づく、高速、高性能、マルチスレッドのオープン ソー...

ショートカットアイコンとアイコンコードの違いの紹介

ステートメント 1: <link rel="shortcut icon" ...

CentOS7 で ethereum/Ethereum を最初からインストールする

目次序文sudo書き込み権限を追加するgit 2.9.0をインストールopenssl 1.1.1l ...

jsネイティブウォーターフォールフロープラグイン制作

この記事では、jsネイティブウォーターフォールフロープラグインの具体的なコードを参考までに共有します...