97

在这里提出了这个问题: Remove empty strings from array whilekeeping index of index with non empty strings

如果您注意到@Baz 列出的给定信息;

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

“我希望由此产生以下两个数组:”

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

这个问题的所有答案都提到了一种循环形式。

我的问题:是否有可能在没有任何循环的情况下删除所有indexes ?...除了迭代数组还有其他选择吗?empty string

可能是我们不知道的一些regex或一些?jQuery

高度赞赏所有答案或建议。

4

7 回答 7

338
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"]

箭头函数文档

于 2013-11-10T10:41:36.103 回答
19
var newArray = oldArray.filter(function(v){return v!==''});
于 2014-03-11T21:34:20.293 回答
10

请注意: 文档说:

filter是 ECMA-262 标准的 JavaScript 扩展;因此, 它可能不会出现在该标准的其他实现中。您可以通过在脚本开头插入以下代码来解决此问题,允许在本机不支持它的 ECMA-262 实现中使用过滤器。该算法正是 ECMA-262 第 5 版中指定的算法,假设 fn.call 计算为 Function.prototype.call 的原始值,并且 Array.prototype.push 具有其原始值。

因此,为了避免一些心痛,您可能必须将此代码添加到脚本的开头

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;
  };
}
于 2013-11-10T10:52:43.120 回答
4
arr = arr.filter(v => v);

返回v时隐式转换为真值

于 2019-01-11T03:27:06.680 回答
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];

于 2014-10-28T14:18:05.307 回答
1

您可以使用 lodash 的方法,它适用于字符串、数字和布尔类型

_.compact([0, 1, false, 2, '', 3]);
// => [1, 2, 3]

https://lodash.com/docs/4.17.15#compact

于 2019-12-23T12:26:04.227 回答
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);
于 2016-09-15T12:38:00.333 回答