这感觉应该很简单,很抱歉,如果我在这里遗漏了一些东西,但我正试图找到一种简单的方法来连接非空或非空字符串。
我有几个不同的地址字段:
var address;
var city;
var state;
var zip;
这些值的设置基于页面中的某些表单字段和其他一些js代码。
我想输出div
中的完整地址,用逗号+空格分隔,如下所示:
$("#addressDiv").append(address + ", " + city + ", " + state + ", " + zip);
问题是,这些字段中的一个或全部可能为空/空。
是否有任何简单的方法可以加入这组字段中的所有非空字段,而无需在将其添加到字符串之前单独检查每个字段的长度?
答案 0 :(得分:137)
考虑
var address = "foo";
var city;
var state = "bar";
var zip;
text = [address, city, state, zip].filter(Boolean).join(", ");
console.log(text)
.filter(Boolean)
(与.filter(x => x)
相同)删除所有“falsy”值(空值,未定义,空字符串等)。如果您对“空”的定义不同,那么您必须提供它,例如:
[...].filter(x => typeof x === 'string' && x.length > 0)
只会在列表中保留非空字符串。
-
(过时的jquery回答)
var address = "foo";
var city;
var state = "bar";
var zip;
text = $.grep([address, city, state, zip], Boolean).join(", "); // foo, bar
答案 1 :(得分:112)
又一个单线解决方案,不需要jQuery
:
var address = "foo";
var city;
var state = "bar";
var zip;
text = [address, city, state, zip].filter(function (val) {return val;}).join(', ');
答案 2 :(得分:13)
Lodash解决方案:_.filter([address, city, state, zip]).join()
答案 3 :(得分:9)
只需:
[address, city, state, zip].filter(Boolean).join(', ');
答案 4 :(得分:5)
@aga's solution很棒,但由于JavaScript引擎中缺少Array.prototype.filter(),因此在IE8等旧浏览器中无效。
对于那些对在各种浏览器(包括IE 5.5 - 8)中工作并且不需要jQuery 的有效解决方案感兴趣的人,请参阅下文:
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 here上描述的一些性能优化。
这是一个用法示例:
var fullAddress = join(', ', address, city, state, zip);
答案 5 :(得分:1)
尝试
function joinIfPresent(){
return $.map(arguments, function(val){
return val && val.length > 0 ? val : undefined;
}).join(', ')
}
$("#addressDiv").append(joinIfPresent(address, city, state, zip));
演示:Fiddle
答案 6 :(得分:0)
$.each([address,city,state,zip],
function(i,v) {
if(v){
var s = (i>0 ? ", ":"") + v;
$("#addressDiv").append(s);
}
}
);`