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

推薦する

Websocket+Vuexはリアルタイムチャットソフトウェアを実装します

目次序文1. 効果は図の通りです2. 具体的な実施手順1. Vuexの紹介2.webscoked実装...

MySQL共通インデックスとユニークインデックスの選択に関する詳細な分析

各人が固有の携帯電話番号で登録し、ビジネス コードによって重複する携帯電話番号が 2 つ書き込まれな...

mysql data_dirの変更によって発生するエラー問題を解決する

今日は、新しく購入した Alibaba Cloud ECS 環境 (Ubuntu 16.04 LTS...

Dockerイントラネット侵入FRP展開の実装プロセスの分析

1. 設定ファイルディレクトリを作成するcd /ホームディレクトリmkdir frp最終的なディレク...

uniAppエディタWeChatスライド問題について

ユニアプリアプレットはWeChatでも同様のドロップダウン問題を抱えることになる解決策は、app.v...

WEB2.0の片手ルール

<br />前回のCSSに関する記事は、多くの人にあまり理解されませんでした。そのため、...

HTMLテーブルタグの詳しい解説(初心者向け)

表> <TR> <TD> <TH> <キャプション&...

CSS を使用してデータ ホットスポット効果を実現する方法

効果は以下のとおりです。 分析する1. ここでは、点を囲む 3 つの円がズームアニメーションを実行し...

モバイルレイアウトにvw+remを使用する方法

まだ rem フレキシブルレイアウトを使用していますか?圧縮された js コードの大きなセクションを...

SQLベースのクエリステートメント

目次1. 基本的なSELECT文1. 指定されたフィールドをクエリする3. エイリアスを設定する4....

MySQLでJSONフィールドを操作する方法

MySQL 5.7.8 では json フィールドが導入されました。このタイプのフィールドは使用頻度...

Dockerイメージ内のファイルを表示する方法

Dockerイメージ内のファイルを表示する方法1. すでに実行中の場合すでに実行中のイメージについて...

CSS3 天子グリッドリストのスタイルの書き方

多くのプロジェクトでは、中央に灰色の分割線があり、両側に分割線がないグリッド表示の機能を実装する必要...

MySQLテーブル内の重複データをクエリする方法

hk_test(ユーザー名、パスワード) に値を挿入 ('qmf1', '...

nginx リクエスト ヘッダー データ読み取りプロセスの詳細な説明

前回の記事では、nginx がリクエスト ラインのデータを読み取って、リクエスト ラインを解析する方...