ホームページ >ウェブフロントエンド >jsチュートリアル >ネストされた JavaScript オブジェクトを効率的にフラット化および非フラット化するにはどうすればよいですか?

ネストされた JavaScript オブジェクトを効率的にフラット化および非フラット化するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-26 00:41:13176ブラウズ

How Can I Efficiently Flatten and Unflatten Nested JavaScript Objects?

ネストされた JavaScript オブジェクトのフラット化と非フラット化

ネストされた JavaScript オブジェクトのフラット化と非フラット化は、多くのアプリケーションで重要なタスクとなる場合があります。ただし、これは複雑で計算コストのかかる操作になる可能性があります。この記事では、パフォーマンスを大幅に向上させる、ネストされたオブジェクトのフラット化とフラット化解除の 2 つのアプローチについて説明します。

効率的なフラット化とフラット化解除

最初のアプローチ、Bergi によって提案されました。では、正規表現を使用してオブジェクト キーを解析し、オブジェクト構造を効率的にナビゲートすることに重点を置いています。非平坦化関数のコードは次のとおりです。

Object.unflatten = function(data) {
    "use strict";
    if (Object(data) !== data || Array.isArray(data))
        return data;
    var regex = /\.?([^.\[\]]+)|\[(\d+)\]/g,
        resultholder = {};
    for (var p in data) {
        var cur = resultholder,
            prop = "",
            m;
        while (m = regex.exec(p)) {
            cur = cur[prop] || (cur[prop] = (m[2] ? [] : {}));
            prop = m[2] || m[1];
        }
        cur[prop] = data[p];
    }
    return resultholder[""] || resultholder;
};

平坦化関数の場合、パフォーマンスを向上させるために「isEmpty」チェックを省略することをお勧めします。

Object.flatten = function(data) {
    var result = {};
    function recurse (cur, prop) {
        if (Object(cur) !== cur) {
            result[prop] = cur;
        } else if (Array.isArray(cur)) {
             for(var i=0, l=cur.length; i<l; i++)
                 recurse(cur[i], prop + "[" + i + "]");
        } else {
            for (var p in cur) {
                recurse(cur[p], prop ? prop+"."+p : p);
            }
        }
    }
    recurse(data, "");
    return result;
}

Non- Regex Approach

2 番目のアプローチ。Bergi によって提案され、Bergi によってさらに修正されました。 AaditMShah は、正規表現の使用を回避し、文字列操作のみに依存してオブジェクト キーを解析します。このアプローチは、オブジェクト キーが特定の命名規則に従っている場合に特に効率的です。

Object.unflatten = function(data) {
    "use strict";
  if (Object(data) !== data || Array.isArray(data)) return data;
  var result = {};
  for (var key in data) {
    var parts = key.split('.'),
      cur = result;
    for (var i = 0; i < parts.length; i++) {
      if (!cur[parts[i]]) {
        cur[parts[i]] = (i == parts.length - 1) ? data[key] : {};
      }
      cur = cur[parts[i]];
    }
  }
  return result[""] || result;
};
Object.flatten = function(data) {
  var result = {};
  function recurse(cur, prop) {
    if (Object(cur) !== cur) {
      result[prop] = cur;
    } else if (Array.isArray(cur)) {
      for (var i = 0; i < cur.length; i++)
        recurse(cur[i], prop + "[" + i + "]");
    } else {
      var isEmpty = true;
      for (var p in cur) {
        isEmpty = false;
        recurse(cur[p], prop ? prop + "." + p : p);
      }
      if (isEmpty) result[prop] = {};
    }
  }
  recurse(data, "");
  return result;
};

パフォーマンス結果

提供されたベンチマークは、これらのアプローチが大幅に改善できることを示しています。ネストされたオブジェクトのフラット化および非フラット化のパフォーマンスが向上し、元のコードと比較して速度が大幅に向上します。これらの手法は、大きくて複雑なオブジェクトを効率的に処理する必要があるシナリオで特に有益です。

以上がネストされた JavaScript オブジェクトを効率的にフラット化および非フラット化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。