【发布时间】:2012-01-06 00:46:02
【问题描述】:
是否可以重写以下 JavaScript 递归函数以使其更快?
function clone_recursive(object) {
var result = {};
for (var key in object) {
var value = object[key];
if (typeof value === 'object') {
result[key] = clone_recursive(value);
} else {
result[key] = value;
}
}
return result;
}
我以迭代的方式重写了它,但它没有获得任何性能,实际上速度下降了 ≈20%。
function clone_iterative(object) {
var result = {};
var queue = [{base: result, value: object}];
var item;
while (item = queue.shift()) {
var current = item.value;
var base = item.base;
for (var key in current) {
var value = current[key];
if (typeof value === 'object') {
var resultValue = base[key] = {};
queue.push({base: resultValue, value: value});
} else {
base[key] = value;
}
}
}
return result;
}
【问题讨论】:
-
你可以重写一个递归算法来使用一个迭代算法,如果递归太深,这有时是必要的,但是你有理由想要专门转向继续传递吗?我认为现有的递归算法会更容易理解……
-
我也希望看到一个迭代版本。
-
我改了问题。唯一的目标是让它更快。
-
你使用的是什么继承实现?如果不是extension(我现在不知道实际名称),那么
clone_recursive的两个实现都可能不正确。 -
outis,让我们假设输入对象是 Object 的直接后代,并且它的所有属性都是自己的属性。
标签: javascript algorithm recursion tree iteration