仅当string不为空或空时,才使用分隔符joinstring?

这感觉应该是简单的,所以对不起,如果我在这里失去了一些东西,但我试图find一个简单的方法来连接非空或非空string。

我有几个不同的地址字段:

var address; var city; var state; var zip; 

这些值取决于页面中的一些表单字段和其他一些JS代码。

我想输出完整的地址在一个div,由逗号+空格分隔,所以这样的事情:

 $("#addressDiv").append(address + ", " + city + ", " + state + ", " + zip); 

问题是,这些字段中的一个或全部可能为空/空。 有没有简单的方法来join这组字段中的所有非空字段,而不需要在将每个字段添加到string之前单独检查每个字段的长度…?

考虑

 var address = "foo"; var city; var state = "bar"; var zip; text = $.grep([address, city, state, zip], Boolean).join(", "); // foo, bar 

$.grep(stuff, Boolean)丢弃空值,未定义,空string和整数0

另一个不需要jQuery的单行解决scheme:

 var address = "foo"; var city; var state = "bar"; var zip; text = [address, city, state, zip].filter(function (val) {return val;}).join(', '); 

Lodash解决scheme: _.filter([address, city, state, zip]).join()

@ aga的解决scheme非常棒,但由于JavaScript引擎中缺lessArray.prototype.filter(),所以在IE8等浏览器中不起作用。

对于那些有兴趣在广泛的浏览器(包括IE浏览器5.5 – 8),并不需要jQuery有效的解决scheme ,请参阅下面:

 var join = function (separator /*, strings */) { // Do not use: // var args = Array.prototype.slice.call(arguments, 1); // since it prevents optimizations in JavaScript engines (V8 for example). // (See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments) // So we construct a new array by iterating through the arguments object var argsLength = arguments.length, strings = []; // Iterate through the arguments object skipping separator arg for (var i = 1, j = 0; i < argsLength; ++i) { var arg = arguments[i]; // Filter undefineds, nulls, empty strings, 0s if (arg) { strings[j++] = arg; } } return strings.join(separator); }; 

它包括在MDN上描述的一些性能优化。

这里是一个用法示例:

 var fullAddress = join(', ', address, city, state, zip); 

尝试

 function joinIfPresent(){ return $.map(arguments, function(val){ return val && val.length > 0 ? val : undefined; }).join(', ') } $("#addressDiv").append(joinIfPresent(address, city, state, zip)); 

演示: 小提琴

 $.each([address,city,state,zip], function(i,v) { if(v){ var s = (i>0 ? ", ":"") + v; $("#addressDiv").append(s); } } );`