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

时间:2013-11-10 10:34:08

标签: javascript arrays indexing string removeall

这个问题在这里被问到: 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"

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

我的问题:是否有可能删除所有index es empty string 而没有任何循环? ..除了迭代数组之外,还有其他选择吗?

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

我们非常感谢所有的答案或建议。

7 个答案:

答案 0 :(得分:290)

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

filter documentation


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

Arrow functions documentation

答案 1 :(得分:18)

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

答案 2 :(得分:8)

请注意: 文档说:

  

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;
  };
}

答案 3 :(得分:3)

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

返回的v被隐式转换为

答案 4 :(得分: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];

答案 5 :(得分: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);

答案 6 :(得分:0)

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

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

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