Javascript - 从数组末尾删除空元素的功能方法

时间:2015-03-05 18:10:56

标签: javascript arrays algorithm

输入数组如下:

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/

最好我喜欢使用内置数组方法的算法,但是如果你有一些惊人的自定义方法或类似的方法来添加到原型中,那就太棒了。

注意:我的目标不是用效率较低的功能方法替代更有效的迭代方法等......它只是对功能美的探索;)

5 个答案:

答案 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 虽然他看起来更漂亮。

perf 22%)   | fiddle

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(/(,"")+]$/,"]"))