仅当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); } } );`