从数组中删除空字符串,同时保持记录无循环?


90

在这里提出了这个问题: 从数组中删除空字符串,同时保留具有非空字符串的索引记录

如果您注意到@Baz所给定的给定,则为;

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

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

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

该问题的所有答案都涉及循环形式。

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

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

所有的答案或建议都受到高度赞赏。

Answers:


323
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
对于这个答案的所有信贷应该去stackoverflow.com/questions/16701319/...
艾萨克

关于一些解释Boolean会很好。
robsch

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

轻松获得最佳答案。确实是问题所要问的。不删除零值。
Bryan

9

请注意: 该文档说:

filter是ECMA-262标准的JavaScript扩展;因此, 它可能不会在该标准的其他实现中出现。您可以通过在脚本的开头插入以下代码来解决此问题,从而允许在本身不支持它的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;
  };
}

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

返回的v是隐式转换为真实


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的好像很多笨重的一个琐碎的任务
艾萨克·

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.