이것은 간단해야 할 것 같아서 여기에 뭔가 빠졌다면 미안하지만 null이 아니거나 비어 있지 않은 문자열 만 연결하는 간단한 방법을 찾으려고합니다.
몇 가지 고유 한 주소 필드가 있습니다.
var address;
var city;
var state;
var zip;
이러한 값은 페이지의 일부 양식 필드와 다른 js 코드를 기반으로 설정됩니다.
div
쉼표 + 공백으로 구분 된 전체 주소를 다음과 같이 출력하고 싶습니다.
$("#addressDiv").append(address + ", " + city + ", " + state + ", " + zip);
문제는 이러한 필드 중 하나 또는 모두가 null / 비어있을 수 있다는 것입니다.
문자열에 추가하기 전에 개별적으로 길이를 확인하지 않고이 필드 그룹의 비어 있지 않은 모든 필드를 조인하는 간단한 방법이 있습니까?
답변
치다
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
답변
다음이 필요하지 않은 또 다른 단선 솔루션 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의 솔루션 은 훌륭하지만 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);
답변
시험
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);
}
}
);`