JavaScript - قم بإزالة الإشارات إلى كائني من المصفوفات الخارجية

StackOverflow https://stackoverflow.com/questions/1767252

  •  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;

أعتقد أنك حلتها الآن ، لكن يمكنك أن تفعل الشيء نفسه تقريبًا ؛ وهو أبسط من استخدام الكائنات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top