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で複数のタイマーを使用する方法の詳細な説明

1.タイムアウトを設定する3 秒後に abc を印刷します。一度だけ実行します。 setTimeou...

ECMAscript の新機能の紹介

目次1. 関数パラメータのデフォルト値1.1 関数パラメータのデフォルト値の指定1.2 分離割り当て...

DOCTYPE HTMLを使用する理由

これがないと、ブラウザはページをレンダリングするときに Quirks モードを使用することがわかって...

Raspberry Pi msmtp と mutt のインストールと設定のチュートリアル

1. muttをインストールするsudo apt-get install mutt 2. msmtp...

MySQLデータベースのマスタースレーブ同期構成と読み取り書き込み分離

MySQL マスター スレーブ レプリケーションを使用する利点は次のとおりです。 1. 安定性を向上...

雨滴効果を実現する JavaScript キャンバス

この記事では、雨滴効果を実現するためのJavaScriptキャンバスの具体的なコードを参考までに紹介...

MySQLとRedisキャッシュ間の同期ソリューションについての簡単な説明

目次1. ソリューション 1 (UDF)デモケース2. ソリューション2(binlogの解析)キャナ...

MySql はデータを正常に挿入しますが、[Err] 1055 エラーが報告されます。解決策

1. 質問:最近、挿入操作を行っています。MySQLのバージョンは5.7です。挿入は成功しますが、エ...

CSS での配置の使用方法の詳細な研究 (要約)

CSS における位置指定の概要position属性は英語で位置を意味し、 CSSでの主な機能は要素...

jsはシンプルな計算機を実装します

参考までに、ネイティブjsを使用して簡単な計算機(詳細なコメント付き)を実装します。具体的な内容は次...

Navicatを使ってMySQLを操作する方法

目次序文: 1. Navicatの紹介2. シンプルなチュートリアルの共有接続管理ライブラリテーブル...

MacにMySQLデータベースをインストールする方法を教えます

Mac 用 MySQL をダウンロード: https://downloads.mysql.com/a...

CentOS7 で MySQL データベースにリモート接続できない理由と解決策

序文最近、仕事で問題が発生しました。 Centos7 システムでは MySQL にリモート接続できな...

IDEA が Docker を統合してリモート展開を実現するための詳細な手順

1. Dockerサーバーへのリモートアクセスを有効にするdocker が配置されているリモート サ...

nginx+FastDFS を使ってファイル管理システムを段階的に構築する

目次1. FastDFS の概要1. はじめに2. FastDFSストレージ戦略3. FastDFS...