展平與取消展平巢狀JavaScript 物件
展平與取消展平巢狀JavaScript 物件可能是許多應用程式中的一項基本任務。然而,這可能是一項複雜且計算成本高昂的操作。在本文中,我們將探索兩種可以顯著提高效能的扁平化和反扁平化嵌套物件的方法。
高效扁平化和反扁平化
第一種方法,由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; }
非-正規表示式方法
第二種方法,由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中文網其他相關文章!