Подтвердить что ты не робот

Присоединяйте строки с разделителем только в том случае, если строки не являются нулевыми или пустыми

Это похоже на то, что это должно быть просто, поэтому извините, если я что-то пропустил здесь, но я пытаюсь найти простой способ конкатенации только ненулевых или непустых строк.

У меня есть несколько различных полей адреса:

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

Значения для них устанавливаются на основе некоторых полей формы на странице и некоторых других js-кодов.

Я хочу вывести полный адрес в div, разделенный запятой + пробелом, так что примерно так:

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

Проблема в том, что одно или все из этих полей могут быть пустыми/пустыми.

Есть ли простой способ объединить все непустые поля в этой группе полей, не проверяя длину каждой отдельно, прежде чем добавлять ее в строку?

4b9b3361

Ответ 1

Рассматривать

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

text = [address, city, state, zip].filter(Boolean).join(", ");
console.log(text)

Ответ 2

Еще одно однострочное решение, для которого не требуется jQuery:

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

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

Ответ 3

Lodash решение: _.filter([address, city, state, zip]).join()

Ответ 4

Просто:

[address, city, state, zip].filter(Boolean).join(', ');

Ответ 5

решение @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);

Ответ 6

Try

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

Демо: Fiddle

Ответ 7

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