Rumah > hujung hadapan web > tutorial js > Bagaimanakah Saya Boleh Meratakan dan Meratakan Objek JavaScript Bersarang dengan Cekap?

Bagaimanakah Saya Boleh Meratakan dan Meratakan Objek JavaScript Bersarang dengan Cekap?

Susan Sarandon
Lepaskan: 2024-12-26 00:41:13
asal
236 orang telah melayarinya

How Can I Efficiently Flatten and Unflatten Nested JavaScript Objects?

Meratakan dan Tidak Meratakan Objek JavaScript Bersarang

Meratakan dan tidak meratakan objek JavaScript bersarang boleh menjadi tugas penting dalam banyak aplikasi. Walau bagaimanapun, ia boleh menjadi operasi yang rumit dan mahal dari segi pengiraan. Dalam artikel ini, kami akan meneroka dua pendekatan untuk meratakan dan tidak meratakan objek bersarang yang boleh meningkatkan prestasi dengan ketara.

Meratakan dan Tidak Merata yang Cekap

Pendekatan pertama, yang dicadangkan oleh Bergi , memfokuskan pada menggunakan ungkapan biasa untuk menghuraikan kekunci objek dan menavigasi struktur objek dengan cekap. Berikut ialah kod untuk fungsi tidak mendatar:

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;
};
Salin selepas log masuk

Untuk fungsi merata, adalah disyorkan untuk meninggalkan semakan "isEmpty" untuk meningkatkan prestasi:

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;
}
Salin selepas log masuk

Bukan- Pendekatan Regex

Pendekatan kedua, dicadangkan oleh Bergi dan diubahsuai lagi oleh AaditMShah, mengelak daripada menggunakan ungkapan biasa dan bergantung semata-mata pada operasi rentetan untuk menghuraikan kekunci objek. Pendekatan ini amat berkesan apabila kekunci objek mengikut konvensyen penamaan tertentu.

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;
};
Salin selepas log masuk
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;
};
Salin selepas log masuk

Hasil Prestasi

Tanda aras yang disediakan menunjukkan bahawa pendekatan ini boleh meningkatkan dengan ketara prestasi meratakan dan tidak meratakan objek bersarang, menawarkan peningkatan kelajuan yang ketara berbanding kod asal. Teknik ini amat berfaedah dalam senario di mana objek besar dan kompleks perlu diproses dengan cekap.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Meratakan dan Meratakan Objek JavaScript Bersarang dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan