문자열이 널이 아니거나 비어 있지 않은 경우에만 구분 기호로 문자열 결합


118

이것은 간단해야 할 것 같아서 여기에 뭔가 빠졌다면 미안하지만 null이 아니거나 비어 있지 않은 문자열 만 연결하는 간단한 방법을 찾으려고합니다.

몇 가지 고유 한 주소 필드가 있습니다.

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

이러한 값은 페이지의 일부 양식 필드와 다른 js 코드를 기반으로 설정됩니다.

div쉼표 + 공백으로 구분 된 전체 주소를 다음과 같이 출력하고 싶습니다.

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

문제는 이러한 필드 중 하나 또는 모두가 null / 비어있을 수 있다는 것입니다.

문자열에 추가하기 전에 개별적으로 길이를 확인하지 않고이 필드 그룹의 비어 있지 않은 모든 필드를 조인하는 간단한 방법이 있습니까?


객체의 모든 필드를 루프, 비교, 폐기하지 않는 이유는 무엇입니까?
elclanrs

답변:


218

치다

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)) 모든 "거짓"값 (null, 정의되지 않음, 빈 문자열 등)을 제거합니다. "비어 있음"에 대한 정의가 다른 경우이를 제공해야합니다. 예를 들면 다음과 같습니다.

 [...].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

117

다음이 필요하지 않은 또 다른 단선 솔루션 jQuery:

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

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

40
이것이 아마도 가장 좋은 대답 일 것입니다. 기본 기능을 사용합니다. 당신이 사용하는 경우 ES6 / es2015 단지로 단축 할 수 [address, city, state, zip].filter(val => val).join(', ')
Sir.Nathan Stassen



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);

1

시험

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

데모 : Fiddle


0
$.each([address,city,state,zip], 
    function(i,v) { 
        if(v){
             var s = (i>0 ? ", ":"") + v;
             $("#addressDiv").append(s);
        } 
    }
);`
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.