160

这感觉应该很简单,如果我在这里遗漏了什么,很抱歉,但我正在尝试找到一种简单的方法来连接非空或非空字符串。

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

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

这些值的设置基于页面中的一些表单字段和一些其他 js 代码。

我想在 a 中输出完整的地址div,用逗号+空格分隔,所以是这样的:

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

问题是,这些字段中的一个或全部可能为空/空。

是否有任何简单的方法可以连接这组字段中的所有非空字段,而无需在将其添加到字符串之前单独检查每个字段的长度?

4

7 回答 7

344

考虑

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))删除所有“虚假”值(空值、未定义值、空字符串等)。如果您对“空”的定义不同,那么您必须提供它,例如:

 [...].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
于 2013-11-11T09:38:07.937 回答
123

另一种不需要的单线解决方案jQuery

var address = "foo";
var city;
var state = "bar";
var zip;

text = [address, city, state, zip].filter(function (val) {return val;}).join(', ');
于 2013-11-11T10:02:20.353 回答
21

只是:

[address, city, state, zip].filter(Boolean).join(', ');
于 2018-03-21T15:29:39.687 回答
15

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

于 2017-01-16T20:32:42.547 回答
5

@aga 的解决方案很棒,但由于其 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 上描述的一些性能优化

这是一个使用示例:

var fullAddress = join(', ', address, city, state, zip);
于 2015-05-19T19:30:53.353 回答
2

尝试

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

演示:小提琴

于 2013-11-11T09:32:32.977 回答
0
$.each([address,city,state,zip], 
    function(i,v) { 
        if(v){
             var s = (i>0 ? ", ":"") + v;
             $("#addressDiv").append(s);
        } 
    }
);`
于 2013-11-11T09:39:36.867 回答