输入数组如下:
var arr = ["some", "", "", "value", "", "", ""];
我需要从尾部删除空元素。所以预期的输出是:
["some", "", "", "value"]
我知道一个无聊的反向循环可以工作,或者pop()直到第一个非空元素。 E.g:
while(arr.pop() === "")
然而,只是为了好玩,我希望看到同样或更有效(如果可能)功能性方法。
我的第一个功能性想法是用反向 - >来实现它。 缩小 - >的逆转即可。然而它似乎很复杂,所以我想看看是否有人有更好的方法。
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/
最好我喜欢使用内置数组方法的算法,但是如果你有一些惊人的自定义方法或类似的方法来添加到原型中,那就太棒了。
注意:我的目标不是用效率较低的功能方法替代更有效的迭代方法等......它只是对功能美的探索;)
答案 0 :(得分:8)
您可以使用reduceRight
。我使用Array.prototype.concat
来保持代码没有突变。另外,我依靠结果的长度来看看何时停止删除空字符串。
var reducedArray = arr.reduceRight(function (result, a) {
return result.length === 0 && a === ""
? result
: [a].concat(result);
}, []);
答案 1 :(得分:1)
如果只是一个空字符串,只需删除最后一个元素怎么样?
var arr = ["some", "", "", "value", "", "", ""];
while ( arr.getLast() == "" ) arr.pop();
(编辑:OP刚编辑了一个问题,说他不想要这种特殊的方法..)
答案 2 :(得分:1)
我认为我有一个更有效的 @Ionut 虽然他看起来更漂亮。
arr.reverse();
arr.some(function(elem, i, array) {
if (elem) {
array.splice(0, i);
return true;
} else return false;
});
arr.reverse();
希望它有所帮助! :)
答案 3 :(得分:1)
问题归结为找到不以空字符串结尾的初始子数组的长度。由于Javascript的Array.prototype.reduce足以将当前索引提供给数组,因此可以通过简单的reduce
来实现:
function trim(arr) {
return arr.slice(0,arr.reduce(function(i,b,j){return b===""?i:j+1},0))
}
在reduce
中,每个点的第一个参数是当前修剪段的长度。由于第三个参数是当前索引,因此需要递增以生成当前长度。
如果reduce
没有为回调提供额外的参数,你可以通过在减少中传递一对值来实现(仍然在功能上,但不太清晰):
function trim(arr) {
return arr.slice(0,arr.reduce(
function(ij,b){
return [b===""?ij[0]:ij[1]+1,
[ij[1]+1]
},[0,0])[0])
}
答案 4 :(得分:0)
我知道stringfy和parse会有一些复杂的问题,但这是我用Regex的一个内容:
var arr = ["some", "", "", "value", "", "", ""];
var result = JSON.parse(JSON.stringify(arr).replace(/(,"")+]$/,"]"))