【发布时间】:2015-03-05 18:10:56
【问题描述】:
输入数组如下:
var arr = ["some", "", "", "value", "", "", ""];
我需要从尾部删除空元素。所以预期的输出是:
["some", "", "", "value"]
我知道一个无聊的反向循环会起作用,或者 pop() 直到它到达第一个非空元素。例如:
while(arr.pop() === "")
但是,只是为了好玩,我希望看到一种同样或更有效(如果可能)功能的方法。
我的第一个功能想法是用 reverse -> reduce -> reverse 来实现它。但是它似乎很复杂,所以我想看看是否有人有更好的方法。
var arr = ["some", "", "", "value", "", "", ""];
var result = arr.reverse()
.reduce(function (a, b) {
if (b != "")
a.addallnext = true;
if (a.addallnext === true)
a.result.push(b);
return a;
}, {
addallnext: false, result: []
}).result.reverse();
这是我的小提琴:
http://jsfiddle.net/fy4cuspq/1/
我希望算法使用内置数组方法,但如果你有一些很棒的自定义方法或类似的方法可以添加到原型中,那就太好了。
注意:我的目标不是用效率较低的函数式方法等替代更有效的迭代方法……这只是对功能美的探索;)
【问题讨论】:
-
所以您想采用
O(n)算法(向后循环或弹出直到得到非空结果)并用O(3n)算法(反向、减少、反向)替换它?跨度> -
当然不是。正如我所说,这只是为了好玩;)探索功能方法。
-
@MattBurland 两种算法都是 O(n)。
-
@JLRishe:正确,我说错了。实际上,如果您考虑最佳情况下的性能,则向后循环是
O(1)(没有空元素),而reverse、reduce、reverse 仍然是O(n)。
标签: javascript arrays algorithm