注意你,你懷疑沒有大問題,因爲所有子目錄,但在folder
您RemoveDir
將由stack.push(cur.subdirs.pop());
線
從他們的父母的subdir
刪除,以找到一個子目錄家長,你可以利用的對象,如詞典,而不是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];
}
}
雖然,除非在處理時你需要採取額外的步驟g刪除文件&文件夾,簡單:
Folder.prototype.RemoveDir = function (folder) {
if (this.subdirs[folder.name] === folder) {
delete this.subdirs[folder.name];
}
}
應該就足夠了。
你沒有使用'RemoveDir'遞歸的原因?樣本中是否有任何附加處理在刪除時需要在文件或文件夾上執行? – outis 2009-11-20 00:33:00
@outis:我只是喜歡迭代遞歸。在某些情況下遞歸執行它可能更具有空間效率,但是我知道寬度(每個級別的子級數)相對於深度而言會很小。實際上,我的應用程序不是關於文件夾和文件,而是具有相同的結構。我的「文件夾」對象有更多屬性需要處理和刪除。 – 2009-11-20 03:55:33