JavaScript オブジェクトの高速かつ効率的なフラット化と非フラット化
ネストされた JavaScript オブジェクトのフラット化と非フラット化は、Web 開発では一般的なタスクですが、計算量が多くなる。この記事では、フラット化操作と非フラット化操作の両方の効率的な実装について説明します。
オブジェクトのフラット化
次のコードは、高度に最適化されたフラット化の実装を提供します。
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 ? prop+"."+i : i); if (l == 0) result[prop] = []; } else { var isEmpty = true; for (var p in cur) { isEmpty = false; recurse(cur[p], prop ? prop+"."+p : p); } if (isEmpty && prop) result[prop] = {}; } } recurse(data, ""); return result; }
平坦化を解消するオブジェクト
非フラット化の場合、次の実装はパフォーマンスの向上を示します。
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; };
ベンチマーク結果
これらの実装により、フラット化のパフォーマンスが大幅に向上します。そして平坦化を解除する操作。 Opera 12.16 では、フラット化は約 2 倍の速さ (~1900 ミリ秒ではなく ~900 ミリ秒) ですが、Chrome 29 では、ほぼ同じ速度 (~1600 ミリ秒ではなく~800 ミリ秒) で改善されています。
注意:
これらの実装は速度を重視しているため、プロトタイプ汚染の影響を受けやすいことに注意してください。したがって、信頼できないオブジェクトに対してそれらを使用しないようにすることが重要です。
以上がJavaScript オブジェクトを効率的にフラット化および非フラット化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。