从数组中删除空字符串但保留记录,不使用循环?

98

这个问题在这里被提出来了:Remove empty strings from array while keeping record of indexes with non empty strings

如果您注意到了,就像@Baz所列出的那样;

"I", "am", "", "still", "here", "", "man"

"并且从这个中我希望得到以下两个数组:"

"I", "am", "still", "here", "man"

所有对这个问题的回答都涉及到一种循环形式。

我的问题是:有没有可能在不使用任何循环的情况下 删除 所有带有空字符串的索引? ... 除了迭代数组之外,是否还有其他替代方法?

也许有一些正则表达式或者我们不知道的一些jQuery方法吗?

非常感谢所有的回答和建议。

7个回答

341
var arr = ["I", "am", "", "still", "here", "", "man"]
// arr = ["I", "am", "", "still", "here", "", "man"]
arr = arr.filter(Boolean)
// arr = ["I", "am", "still", "here", "man"]

filter 文档


// arr = ["I", "am", "", "still", "here", "", "man"]
arr = arr.filter(v=>v!='');
// arr = ["I", "am", "still", "here", "man"]

箭头函数文档


3
我明白你的感受,我几个月前也用过它,解决了很多小问题。 - Isaac
14
@DiegoPlentz提到仍在使用IE8的人将会遇到比仅仅移除数组中空白更多的问题……现在我几乎不会考虑支持那个浏览器。 - Isaac
这是目前我们能够得到的最接近 array.filter(!!) 的方法 :) - james_womack
2
这个答案的所有功劳应归于https://dev59.com/EXLYa4cB1Zd3GeqPXm98 - Isaac
1
关于Boolean的一些解释会很好。 - robsch
@robsch 布尔函数用作测试函数,将值转换为布尔值。空字符串被视为假值,而非空字符串被视为真值。 - psychoslave

19
var newArray = oldArray.filter(function(v){return v!==''});

轻松地给出了最佳答案。完全满足问题的要求。不会删除零值。 - Bryan

10

请注意: 文档说明如下:

filter是ECMA-262标准的JavaScript扩展。因此,它可能不存在于标准的其他实现中。您可以通过在脚本开头插入以下代码来解决这个问题,在不支持filter的ECMA-262实现中使用它。假设fn.call评估为Function.prototype.call的原始值,并且Array.prototype.push具有其原始值,则该算法与ECMA-262第5版中指定的完全相同。

因此,为了避免一些麻烦,您可能需要在脚本开头添加此代码。

if (!Array.prototype.filter) {
  Array.prototype.filter = function (fn, context) {
    var i,
        value,
        result = [],
        length;
        if (!this || typeof fn !== 'function' || (fn instanceof RegExp)) {
          throw new TypeError();
        }
        length = this.length;
        for (i = 0; i < length; i++) {
          if (this.hasOwnProperty(i)) {
            value = this[i];
            if (fn.call(context, value, i, this)) {
              result.push(value);
            }
          }
        }
    return result;
  };
}

4
arr = arr.filter(v => v);

作为返回值,v 会被隐式转换为 truthy

2
如果你正在使用jQuery,grep可能会很有用:
var arr = [ a, b, c, , e, f, , g, h ];

arr = jQuery.grep(arr, function(n){ return (n); });

arr现在是[a,b,c,d,e,f,g];


2
jQuery 对于一个微不足道的任务来说似乎有点笨重。 - Isaac

1

0
即我们需要将多个电子邮件地址按逗号、空格或换行符分隔,如下所示。
    var emails = EmailText.replace(","," ").replace("\n"," ").replace(" ","").split(" ");
    for(var i in emails)
        emails[i] = emails[i].replace(/(\r\n|\n|\r)/gm,"");

    emails.filter(Boolean);
    console.log(emails);

.replace(" ","").split(" ") 将所有空格替换为空字符串,然后尝试在每个空格处进行分割。 - Isaac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接