2017-01-31 2 views
1

어레이의 해시가 o이라고 가정 해 봅니다. 각 이벤트가 0 개 이상의 콜백을 가질 수있을 때 이벤트에 대한 등록 된 콜백.배열을 하나의 요소로 초기화하거나 배열이 존재하는 경우 요소를 밀어 넣으십시오.

ES6에서 더 좋은 방법이 있습니까?

if (key in o) o[key].push(x); else o[key] = [x] 

"더 나은"이란 말은 다른 개발자가 쉽게 이해할 수 있음을 의미합니다. 가능하면 더 간결하지만 가독성을 희생 시키지는 않습니다. 특히 (공통적 인) 문제는 o이 더 긴 표현 인 경우가 많다는 것입니다. this.listeners, 3 회 반복하는 것은 차선책으로 보입니다. 따라서 실제 코드는 다음과 같을 수 있습니다.

if (event in this.listeners) 
    this.listeners[event].push(callback); 
else 
    this.listeners[event] = [callback]; 

답변

6

필요에 따라 논리 OR을 사용하여 배열을 만들 수 있습니다. 이 한번만 o[key] 반복

(o[key] = o[key] || []).push(x); 

:

o[key] = o[key] || []; 
o[key].push(x); 
+0

을 – Jakob

0
try { 
    o[key].push(x) 
} 
catch(e) { 
    //cannot push to undefined exception 
    o[key] = [x] 
} 
+3

오, 예외를 사용하는 소년은 ** 좋은 ** 이유가있는 경우에만 발생해야합니다. 여기에 아무도 없습니다 ... – KarelG

3

한가지 해결책은 논리 OR 빈 어레이를 사용하고, 생성 된 어레이에 푸시한다.

결과는 o[key](o[key] = o[key] || []) 지정 주위에 괄호가 있음에 유의하십시오.

o[key] = (o[key] || []).push(x) 푸시가 배열의 새로운 길이를 반환하기 때문에 올바르지 않습니다.

+0

그것이 작동하는 동안, 괄호 안의 과제 때문에 첫눈에 오독되기 쉽습니다. –

+1

@NinaScholz : JS에서는 (어쨌든'|| = "default assignment operator"가 없기 때문에) 다소 어색하지만, 당신이 숙어에 익숙하다면 그렇게 나쁘지 않다. 많은 관용구는 처음에는 불투명하지만, 경험상 (예 : 유비쿼터스'!!' "부울 라이저 연산자") 아주 쉽게 읽을 수있게되었습니다. – Amadan

+1

@Amadan, 그것은 줄 안에서 할당 연산자의 문제입니다. –

0

다음과 같이 수행 할 수도 있습니다. 성능에 약간의 차이가 있습니다.

o[key] = o[key] ? o[key].concat(x) : [x] 
o[key] ? o[key].push(x) : o[key] = [x] 
o[key] && o[key].push(x) || (o[key] = [x]) 
+0

이것들은 정확하지만,'o [key]'를 가능한 한 수회 반복하는 것을 선호합니다 (이것은 2 인 것처럼 보입니다). –

1

거의 동일하지만 배열 초기화 구문을 사용할 수 있습니다 (이것은 새로운 배열을 생성한다는 점을 제외하고) 다른 답변 등이 가장 짧은하지만 대부분의 읽을 수있는 양식을하지 않습니다

o[key] = [...o[key] || [], x]; 
관련 문제