Ответ 1
Рассматривать
var address = "foo";
var city;
var state = "bar";
var zip;
text = [address, city, state, zip].filter(Boolean).join(", ");
console.log(text)
Это похоже на то, что это должно быть просто, поэтому извините, если я что-то пропустил здесь, но я пытаюсь найти простой способ конкатенации только ненулевых или непустых строк.
У меня есть несколько различных полей адреса:
var address;
var city;
var state;
var zip;
Значения для них устанавливаются на основе некоторых полей формы на странице и некоторых других js-кодов.
Я хочу вывести полный адрес в div
, разделенный запятой + пробелом, так что примерно так:
$("#addressDiv").append(address + ", " + city + ", " + state + ", " + zip);
Проблема в том, что одно или все из этих полей могут быть пустыми/пустыми.
Есть ли простой способ объединить все непустые поля в этой группе полей, не проверяя длину каждой отдельно, прежде чем добавлять ее в строку?
Рассматривать
var address = "foo";
var city;
var state = "bar";
var zip;
text = [address, city, state, zip].filter(Boolean).join(", ");
console.log(text)
Еще одно однострочное решение, для которого не требуется jQuery
:
var address = "foo";
var city;
var state = "bar";
var zip;
text = [address, city, state, zip].filter(function (val) {return val;}).join(', ');
Lodash решение: _.filter([address, city, state, zip]).join()
Просто:
[address, city, state, zip].filter(Boolean).join(', ');
решение @aga отлично, но оно не работает в старых браузерах, таких как IE8 из-за отсутствия Array.prototype.filter() в своих механизмах JavaScript.
Для тех, кто заинтересован в , эффективное решение, работающее в широком диапазоне браузеров (включая 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);
Try
function joinIfPresent(){
return $.map(arguments, function(val){
return val && val.length > 0 ? val : undefined;
}).join(', ')
}
$("#addressDiv").append(joinIfPresent(address, city, state, zip));
Демо: Fiddle
$.each([address,city,state,zip],
function(i,v) {
if(v){
var s = (i>0 ? ", ":"") + v;
$("#addressDiv").append(s);
}
}
);`