조건부 요소로 배열을 정의하는 방법은 무엇입니까?


107

조건부 배열 요소를 어떻게 정의 할 수 있습니까? 나는 다음과 같이하고 싶다.

const cond = true;
const myArr = ["foo", cond && "bar"];

이것은 예상대로 작동합니다. ["foo", "bar"]

내가 설정 한 경우 그러나 condfalse, 나는 다음과 같은 결과를 얻을 :["foo", false]

조건부 요소로 배열을 어떻게 정의 할 수 있습니까?


답변:


252

조건이 인 경우 항목 배열을 깨끗하게 유지하기 위해 배열 내부에 배열을 분산 할 수 있습니다 false.

방법은 다음과 같습니다 .

// Will result in ['foo', 'bar']
const items = [
  'foo',
  ... true ? ['bar'] : [],
  ... false ? ['falsy'] : [],
]

console.log(items)

설명 :

보시다시피 삼항 연산자는 항상 배열을 반환합니다.

조건이 true이면 ['bar'], 그렇지 않으면 빈 배열을 반환합니다 [].

그 후 ...결과 배열 (삼항 연산에서) 을 펼치고 배열의 항목이 상위 배열로 푸시됩니다.

배열 항목이 없으면 (삼항 검사가 인 경우 false) 아무것도 푸시되지 않습니다. 이것이 우리의 목표입니다.


다른 답변에서 나는 동일한 아이디어를 설명했지만 객체에 대해 설명했습니다. 여기 에서도 확인할 수 있습니다 .


1
나는 최근에 이것을해야했고 스프레드를 사용하는 것이 나에게 가장 확실한 해결책처럼 보였다. 다른 사람들도이 패턴을 사용하고 있습니다. 너무 은밀하게 만들고 싶지 않았지만 충분히 인기가있는 것 같아서 함께 달릴 것입니다.
Brennan Cheung

고마워요 ~ !! 난 그냥도 옵션으로 확산을 고려하지 않았다
carinlynchin

이것은 매우 멋지다, 사실 후에 어레이를 필터링하지 않고 이것을 할 수있는 방법이있을 것이라고 생각하지 않았다
JDune

2
젠장 그게 내가 Ecmascript를 좋아하는 이유입니다
anni

1
훌륭한 솔루션!
catch22

25

나는 이것을 할 것이다

[
  true && 'one',
  false && 'two',
  1 === 1 && 'three',
  1 + 1 === 9 && 'four'
].filter(Boolean) // ['one', 'three']

이렇게하면 빈 문자열과 같은 잘못된 값 도 제거 됩니다.


1
나는 아이디어를 좋아한다. 그러나 귀하의 구현은 [true && '']에 대해 잘못되었습니다. 빈 문자열은 필터링됩니다. 차라리 [foo] .filter (isNonBoolean) 또는 [foo] .stripBoolean ()과 같은 도우미 함수를 사용합니다
Martin

@Martin 예, 아마도 그 대답에서 정교해질 수 있습니다. 계속해서 편집하겠습니다!
Michael Bergquist Suarez

다음과 같은 배열이 필요하면 문제가있을 것이라고 생각합니다. const arr = [ 'one', 'two', false, true]; 그러나 아이디어는 : truthy 값에 좋다
Sanjib 상통


8

당신이 경우 정말 한 라이너로 유지하려면, 당신은 사용할 수 있습니다 :

const cond = true;
const myArr = ["foo"].concat(cond ? ["bar"] : []);

영리하고, 배열의 조건부 앞쪽에 유용했습니다.const myArr = (cond ? ['item 1'] : []).concat(['item 2', 'item 3']);
devonj

6

다음을 사용하는 것 외에는 많은 옵션이 없습니다 push.

const cond = true;
const myArr = ["foo"];

if (cond) myArr.push("bar");

또 다른 아이디어는 잠재적으로 null을 추가하고 필터링하는 것입니다.

const cond = true;
const myArr = ["foo", cond ? "bar" : null];

myArr = myArr.filter((item) => item !== null);

3
const cond = false;
const myArr = ["foo", cond ? "bar" : null].filter(Boolean);

console.log(myArr)

결과는 [ "foo"]입니다.


2

몇 가지 다른 방법이 있지만 수행하는 방식은 실제로 Javascript에서 작동하지 않습니다.

가장 쉬운 해결책은 if 문을 사용하는 것입니다.

if (myCond) arr.push(element);

도 있습니다 filter.하지만 어떤 조건에 대해 모든 것을 확인하는 것보다 "이 한 가지 조건이 참이면이 한 가지 추가"를 선택하는 것처럼 보이기 때문에 여기에서 원하는 것이 전혀 없다고 생각합니다. 비록 당신이 정말로 이상해지기를 원한다면 이것을 할 수 있습니다 (권장하지는 않지만 할 수 있다는 것은 멋지다).

var arr = ["a", cond && "bar"];
arr.filter( e => e)

기본적으로 모든 비 참 값을 필터링합니다.


1
이것은 멋지다. var arr = ["a", cond && "bar"].filter(e => e);@Adam LeBlanc 을 할 수도 있지만 당신 말이 맞습니다. 아마도 쓰레기 일 것입니다. 하지만 쓰레기를 냉각)
마누 쉴러

멋지지만 조건부 값 하나에 대해 반대하는 것이 좋습니다. 일반적인 목적 "모든 거짓 값 제거"유형에 더 적합합니다. 당신은 단지 하나의 값에 대해 전체 배열을 통과하게 될 것이기 때문에. 그러나 결정되지 않은 양의 조건부 값이 있다면 아마도 좋은 해결책 일 것입니다.
Adam LeBlanc

.filter (e => e)는 빈 문자열을 필터링합니다.
Martin

0

대체 방법 : 사후 필터링 대신 사전 필터 채우기 :

const populate = function(...values) {
    return values.filter(function(el) {
        return el !== false
    });
};

console.log(populate("foo", true && "bar", false && "baz"))

보고

(2) ["foo", "bar"]

나는 그것이 속기 표기법을 해결하지 못한다는 것을 알고 있지만 (당신이 무엇을 시도해도 작동하지 않기 때문에) 그것에 가깝습니다.


0

es6를 사용하는 경우 제안합니다.

let array = [ "bike", "car", name === "van" ? "van" : null, "bus", "truck", ].filter(Boolean);

이 배열은 이름이 "van"과 같으면 "van"값만 포함하고, 그렇지 않으면 폐기됩니다.


-1

당신이 사용한다면 Array.push

따라 할 수 있습니다

var a = ["1"]
a.push(... !true ? ["2"] : [])

결과는 ["1"]

또는

var a = ["1"]
a.push(... true ? ["2"] : [])

결과는 ["1","2"]


a check와 a 를 사용하려는 경우 push귀하의 솔루션은 확실히 가장 명확성이 높은 솔루션이 아닙니다. if (check) foo.push( item );허위 사건에 빈 배열을 퍼뜨리는 대신 고수 할 것입니다.
Martin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.