2017-03-06 5 views
2

고유 한 값의 배열이 있고 중복을 만들지 않고 조건을 충족하는 다른 배열의 새 요소를 푸시한다고 가정 해 보겠습니다. 예 :요소가 JS 배열에 있는지 확인하거나 추가하고 _.uniq를 실행하는 것이 더 낫습니까?

자바 스크립트 성능에 관하여
newArray.forEach(function(element){ 
    if (condition) { 
    oldArray.push(element); 
    } 
}) 

,이 요소가 배열에 밀어 전에 이미 존재하는 경우, 루프의 각 반복에서 확인하거나 조건을 충족하는 모든 요소를 ​​추가하는 것이 좋습니다이며, underscore.js에서 _.uniq를 실행 하시겠습니까?

newArray.forEach(function(element){ 
    if (condition && !oldArray.includes(element)) { 
    oldArray.push(element); 
    } 
}) 

은 대 :

newArray.forEach(function(element){ 
    if (condition) { 
    oldArray.push(element); 
    } 
}) 
oldArray = _.uniq(oldArray); 

어쩌면 정말 작은 프로젝트 및 배열의 ​​차이를하지 않습니다,하지만 난 큰 규모의 프로젝트를 위해 최선의 방법을 알고 싶습니다.

+1

배열을'Set' 객체로 변환하고'mySet.add ("whetever")'와 같이 안전하게 추가 할 수 있습니다. 'Set' 객체는 당신의 요구를 만족시켜야합니다. 그러나 만약 당신이 그것을 줄이거 나 매핑해야한다면'[... mySet] .reduce ((p, c) => ..')와 같이 참조 할 수 있습니다. – Redu

+0

고마워요 @ 리두 세트를 살펴 보겠습니다. – tany4

답변

1
_.uniq(oldArray); 

은 배열의 다른 루프를 수행하므로 배열이 수천 개의 요소로 이루어져 있다고 가정하면 확실하게 첫 번째 해법이 더 좋습니다. 가 indexOf이 만들어 funcion 포함 내부

은 아마 더 유용는, includes, 가리키고 대신 indexOf을 사용하는 것입니다

newArray.forEach(function(element){ 
    if (condition && oldArray.indexOf(element)===-1) { 
    oldArray.push(element); 
    } 
}) 

당신이 볼 수있는 방법을의 포함 prototipe은 다음과 같습니다

String.prototype.includes = function(search, start) { 
    'use strict'; 
    if (typeof start !== 'number') { 
     start = 0; 
    } 

    if (start + search.length > this.length) { 
     return false; 
    } else { 
     return this.indexOf(search, start) !== -1; 
    } 
    }; 
+0

그 점은 Mr.Bruno의 유효 포인트입니다. 그러나 underscore.js가 실행하는 최적화는 어떻습니까? – tany4

+0

@ tany4 thats true인데, for와 uniq를 수행하면 항상 더 많은 루프를 만들고 –

0

우아한 해결책은 객체가 아니라 Array를 사용하는 것입니다. 키 사용하여 값과 같거나 키와 같은 값을 "true"값 :

{ 
    "value":"value" 
} 

또는

{ 
    "value": true 
} 

당신이 작업하는 동안. 키의 배열이 필요할 때 "for (p in obj)"를 배열로 변환하십시오.

그런 식으로 배열의 연산은 추가 노력없이 기본적으로 고유하며 배열을 반환 할 때만 계산이 사용됩니다.

밑줄 또는 로다시를 사용하는 경우 _.keys (obj)도 사용할 수 있습니다.

+0

에 대한 첫 번째 연산자 만 사용합니다. OP는 값을 식별 할 수있는 키가 OP에 없다고 말했습니다. – JLRishe

+0

그 이유는 내가 값을 키로 사용할 것을 제안했기 때문입니다. 아. 젠장. – campino2k

+0

내 대답을 수정했습니다. 힌트를 가져 주셔서 감사합니다. – campino2k