JavaScript - قم بإزالة الإشارات إلى كائني من المصفوفات الخارجية
-
21-09-2019 - |
سؤال
لدي مشكلة في إزالة كائن JavaScript ووضعه على NULL.
هنا ، لدي تطبيق مجلد يدعم إزالة الدليل الفرعي العودية. يرجى الاطلاع على تعليقاتي لفهم معضلي.
function Folder(name, DOM_rows) {
this.name = name;
this.files = [].concat(DOM_rows);
this.subdirs = [];
}
Folder.prototype.AddDir(name, DOM_rows) {
this.subdirs.push(new Folder(name, DOM_rows));
}
Folder.prototype.RemoveDir(folder) {
var stack = [folder];
while(stack.length > 0) {
var cur = stack.pop();
// do a post-order depth-first traversal, so dig to the deepest subdir:
if(cur.subdirs.length > 0) {
while(cur.subdirs.length > 0) { stack.push(cur.subdirs.pop()); }
} else {
// arrived at a leaf-level:
cur.files = null;
// now how do I delete cur from it's parent's subdirs array?
// the only way I know how is to keep a "cur.parentDir" reference,
// then find parent.subdirs[ index of cur ] and slice it out.
// How can I do the JS-equivalent of *cur = NULL?
}
}
}
المحلول
لاحظ أنه ليس لديك مشكلة كبيرة كما تشك في ذلك ، لأن جميع الدلائل الفرعية ولكن folder
في الخاص بك RemoveDir
سيتم حذفه من والديهم subdir
بواسطة stack.push(cur.subdirs.pop());
خط
للعثور على دليل فرعي في أحد الوالدين ، يمكنك استخدام كائن-كقواس بدلاً من صفيف لـ subdirs
:
function Folder(name, DOM_rows, parent) {
this.name = name;
this.parent = parent;
this.files = [].concat(DOM_rows);
this.subdirs = {};
this.subdirCount = 0;
}
Folder.prototype.AddDir = function (name, DOM_rows) {
if (this.subdirs[name]) {
return null;
}
++this.subdirCount;
return this.subdirs[name] = new Folder(name, DOM_rows, this);
}
بالنظر إلى مجلد ، يمكنك إزالة المجلد من الوالد مع:
delete folder.parent.subdirs[folder.name];
إليك نسخة مسبقة:
Folder.prototype.RemoveDir = function (folder) {
if (this.subdirs[folder.name] === folder) {
var stack = [folder];
while(stack.length > 0) {
var cur = stack.pop();
// pre-order
delete cur.files;
// if there's other processing to be done, now's the time to do it
for (subdir in cur.subdirs) {
stack.push(cur.subdirs[subdir]);
delete cur.subdirs[subdir];
}
// it's unnecessary to set subdir count, since 'cur' has been deleted
//cur.subdirCount = 0;
}
delete this.subdirs[folder.name];
--this.subdirCount;
}
}
ونسخة ما بعد الترتيب العودية:
Folder.prototype.RemoveChildren = function () {
for (subdir in this.subdirs) {
this.RemoveDir(this.subdirs[subdir]);
}
}
Folder.prototype.RemoveDir = function (folder) {
if (this.subdirs[folder.name] === folder) {
folder.RemoveChildren();
folder.files = [];
delete this.subdirs[folder.name];
--this.subdirCount;
}
}
ونسخة ما بعد الترتيب التكرارية:
Array.prototype.top = function () { return this[this.length-1]; }
Folder.prototype.RemoveDir = function (folder) {
if (this.subdirs[folder.name] === folder) {
var stack = [folder];
while(stack.length > 0) {
var cur = stack.top();
if (cur.subdirCount > 0) {
for (subdir in cur.subdirs) {
stack.push(cur.subdirs[subdir]);
delete cur.subdirs[subdir];
}
cur.subdirCount = 0;
} else {
stack.pop();
delete cur.files;
// other post-order processing
}
}
delete this.subdirs[folder.name];
}
}
رغم ذلك ، ما لم تكن بحاجة إلى اتخاذ خطوات إضافية عند معالجة الملفات والمجلدات المحذوفة ، بسيطة:
Folder.prototype.RemoveDir = function (folder) {
if (this.subdirs[folder.name] === folder) {
delete this.subdirs[folder.name];
}
}
يجب أن يكفي.
نصائح أخرى
كل شيء يتم تمرير JavaScript حسب القيمة ، لذلك "*cur = null" غير ممكن. لديك بشكل أساسي الخيارات التالية هنا
- استخدم ParentID كما اقترحت
- إذا كان للتسلسل الهرمي للمجلد جذر معروف ، فتصفح من هذا الجذر للعثور على الكائن الأصل
- استخدم شيئًا مثل DOM removechild (الذي يسمى الوالدين) ، بدلاً من removenode (الذي يسمى العقدة نفسها).
كنت أحاول أن أفعل نفس الشيء اليوم. لقد عملت حوله عن طريق تخزين فهرس الكائن كخاصية للكائن نفسه.
عند إضافته:
myObj.ID = myArr.push(myObj);
لإزالته لك
myArr[myObj.ID] = null;
أعتقد أنك حلتها الآن ، لكن يمكنك أن تفعل الشيء نفسه تقريبًا ؛ وهو أبسط من استخدام الكائنات.