从JavaScript数组中删除空值

36

我有一个 JavaScript 数组。

addresses = new Array(document.client.cli_Build.value, 
    document.client.cli_Address.value, 
    document.client.cli_City.value, 
    document.client.cli_State.value, 
    document.client.cli_Postcode.value, 
    document.client.cli_Country.value);
document.client.cli_PostalAddress.value = addresses.join(", ");
我需要将所有这些数组值的内容复制到邮寄地址文本区域。 当我使用上述的join函数时,逗号会添加到空值中。如何删除这些额外的逗号?
谢谢
9个回答

51
你可以使用 filter 方法来过滤掉 null 值:
addresses.filter(function(val) { return val !== null; }).join(", ")

1
@Victor:看看我的上一条评论。 - Gumbo
你甚至不需要使用 "val !== null",因为返回 null 会被视为 false,所以你可以直接使用 "return val;" - chrismarx
1
@chrismarx 我的意思是 [null,undefined,"",0,NaN].filter(function(val) { return val; }) 返回一个空数组,而不仅仅是 [undefined,"",0,NaN]。然而,function(val) { return val !== null; } 则确切地做到了这一点。 - Gumbo
@chrismarx 也许你会,但克里希纳·普里亚可能不会。 - Gumbo
1
更好的版本:addresses.filter(val => { return !!val }).join(', ') - Justin
显示剩余11条评论

12
使用 filter 方法来移除所有 falsy 值:

var list = [null, undefined, 0, 1, 2, '', 'test'];

// ES5:
var result = list.filter(Boolean).join(', ');
console.log(result);

// ES6, saves 3 characters:
var result = list.filter(x => x).join(', ');
console.log(result);


5
filter(Boolean)会过滤掉所有的假值,所以如果你想保留0,你需要将它作为'0'传递进去。 - Elena
1
我实际上更喜欢ES5版本,因为它更清楚你的意图 - 我只知道ES6版本,所以感谢你教我老派的方法 :) - icc97
我认为ES5版本非常晦涩,一点也不清晰。我会把它理解为“过滤布尔值” - 实际上我必须思考,“哦,Boolean是一个以初始值作为参数的构造函数,所以这里将数组的值传递给了该构造函数”。我希望构造函数不再接受任何其他参数。 在我看来,这段代码读起来很不顺畅。 - Max Waterman
我认为ES5版本非常晦涩,一点也不清晰。我会把它理解为“过滤布尔值” - 实际上,我必须思考,“哦,Boolean是一个以初始值作为参数的构造函数,所以这是将数组值传递给该构造函数”。我希望构造函数不再接受任何其他参数。 在我看来,这个版本读起来一点也不好。 - undefined

6
另一种过滤器替代方案。
myArray.filter(function(val){if(val)return val}).join(", ")

document.write(['this','','',,,,'is','a',,,'test'].filter(function(val){if(val)return val}).join(", "));


5

Underscore是一个非常好用的实用库,主要用于函数式编程和列表操作:

_.filter(addresses, function(val) { return val !== null; }).join(", ");

编辑:还有一种更紧凑的方法(感谢Andrew De Andrade!):
_.compact(addresses).join(", ");

1
_.compact()执行一个过滤器,删除假值:http://documentcloud.github.com/underscore/#compact - Andrew De Andrade

1

addresses.filter(Boolean).join(", ")

可以翻译成:

addresses.filter(Boolean).join(", ")


0

你还可以使用Array.prototype.reduce()

它将数组“减少”为一个单一的值,比如一个字符串。像这样:

addresses.reduce(function (a, b) {
        if (a && b) { return a + ', ' + b; }
        if (a) { return a; }
        return b;
      }, '');

a 保存中间结果, b 保存当前元素。


0
使用以下代码仅删除null值,它简短而简单:
addresses = addresses.filter(n => (n===null) ? false : true).join(', ');
document.client.cli_PostalAddress.value = addresses;

如果您想要移除 null0false""(空字符串)这些值,可以使用以下代码:
document.client.cli_PostalAddress.value = addresses.filter(Boolean).join(', ');

0
document.client.cli_PostalAddress.value = 
    document.client.cli_PostalAddress.value.replace(/(, )+/g,", ");

还是应该这样吗?

document.client.cli_PostalAddress.value = 
    document.client.cli_PostalAddress.value
    .replace(/(null, )/g,"").replace(/(, null)/g,"");

??


添加一个"g"以执行多个搜索和替换。 - Murali
这段代码运行得非常好。感谢您的快速回复。document.client.cli_PostalAddress.value=document.client.cli_PostalAddress.value.replace(/(, )+/g,", ");但是我发现地址末尾多了一个逗号。 - Krishna Priya
/移除空值/ document.client.cli_PostalAddress.value=document.client.cli_PostalAddress.value.replace(/(, )+/g,", "); /* 移除最后一个逗号 */ document.client.cli_PostalAddress.value = document.client.cli_PostalAddress.value.slice(0, -2); /移除第一个逗号/ document.client.cli_PostalAddress.value = document.client.cli_PostalAddress.value.substr(1); 我使用了这些代码,现在运行良好。非常感谢您的帮助。 - Krishna Priya

0
如果您想要消除所有的undefined、null、NaN、""、0,一种简单的方法是使用过滤回调函数和布尔函数的组合。
var filterArr=arr.filter(function(val){
   return Boolean(val);  
  });

当你将一个值传递给布尔函数时,如果该值被省略或为0、-0、null、false、NaN、undefined或空字符串(""),则对象的初始值为false。

以下是此用法的示例:

 function bouncer(arr) {

         var filterArr=arr.filter(function(val){
           return Boolean(val);  
          });

      return filterArr;
    }

以下是一些测试:

bouncer([1, null, NaN, 2, undefined]);//should return [1, 2]
bouncer([7, "ate", "", false, 9]);// should return [7, "ate", 9]
bouncer(["a", "b", "c"]);// should return ["a", "b", "c"]
bouncer([false, null, 0, NaN, undefined, ""]);//should return []

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