首頁 >web前端 >js教程 >如何有效地展平和取消展平嵌套 JavaScript 物件?

如何有效地展平和取消展平嵌套 JavaScript 物件?

Susan Sarandon
Susan Sarandon原創
2024-12-26 00:41:13179瀏覽

How Can I Efficiently Flatten and Unflatten Nested JavaScript Objects?

展平與取消展平巢狀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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn