2017-12-15 17 views
1

많은 다른 "목록"항목을 사용하는 NodeJS 코드를 만들고 있습니다. 기본 구현은 Immutable.List, Immutable.Set, Javascript Array 및 Javascript Set를 사용합니다.동일한 코드를 사용하여 immutable.List, immutable.Set 또는 Javascript Array 또는 Set으로 반복 할 수 있습니까?

내가 들어 가지 않는 이유 때문에 기본 컬렉션에 관계없이 이러한 항목을 반복 할 수 있기를 바랍니다.

일부 배경이 유용 할 수 있습니다. Array의 경우 다음을 사용하여 Javascript 배열을 반복 할 수 있습니다. 다음과 같이

Immutable.List를 들어
let anArray = [ new SomeObj(), new SomeObj(), ... ] 
for(let idx=0; idx < anArray.length; idx++){ 
    let someObj = anArray[idx]; 
    // ... etc 
    if (someCondition) break; 
} 

, 내가 (대신 길이 속성)을 Immutable.List.size 속성을 사용하고 "Immutable.List.get"기능을 사용할 필요가 :

const immutable = require('immutable'); 

let aList = immutable.List([ new SomeObj(), new SomeObj(), ... ]); 
for(idx=0; idx < aList.size; idx++){ 
    var item = aList.get(idx); 
    // ... etc 
    if (someCondition) break; 
} 

약간의 차이점을 제외하고는 루핑 로직이 매우 가깝습니다.

이러한 각 개체에서 사용할 수있는 forEach() 메서드를 사용하면 자연스러운 대답을 제시하는 사람들에게 도움이됩니다. 일반적인 자바 스크립트 Array.forEach()은 루프가 깨지는 것을 처리하지 않습니다 (이 경우 Array.some() 메서드가 필요합니다). Immutable.List는 루프에서 "깨는"것을 지원하는 Immutable.Collection.forEach을 기반으로합니다. 그래야 작동 할 수 있지만 Javascript 객체를 변경 불가능한 시퀀스/컬렉션으로 래핑해야합니다. 필자는 Immutable 라이브러리를 처음 사용하기 때문에 Immutable에 익숙한 사람들에게 잘 알려진 또 다른 접근법이있을 수 있습니다.

내가 생각하고있는 접근 방식을 다음에 설명합니다.

for(let idx=0, looper=new Looper(aListOrSet); idx < looper.length(); idx++){ 
    var item = looper.get(idx); 
    // ... etc 
    if (someCondition) break; 
} 

내가 검토 한 어떤 것들은 다음과 같습니다 : 나는 다음과 같은 솔루션을 제공하는 유틸리티 기능을 생각하고

누구든지이 문제를 해결하려고 했습니까? 그렇다면이 문제를 어떻게 해결 했습니까?

+0

내 솔루션을 구현할 때 Javascript Set은 인덱스를 기반으로 세트에서 항목을 가져 오는 방법을 제공하지 않는다는 것을 깨달았습니다. 그래서 constructor (anObj), length() 캐시 (필요한 경우), length를 반환하는 메소드와 주어진 인덱스에서 항목을 반환하는 get (idx) 메소드를 가진 Looper라는 클래스를 만들었습니다. 이 정보를 반영하도록 질문을 업데이트하겠습니다. – PatS

답변

1

for...of 루프를 사용할 수 있습니다. 이렇게하면 내장 된 컬렉션과 Immutable.js 컬렉션을 포함하는 Iterable 개체에서 작업 할 수 있습니다.

for (let element of collection) { 
    // do something with element 
    if (someCondition) { 
     break; 
    } 
} 

그것은 당신이 정기적 for 루프 또는 forEach 것 같은 반복의 인덱스에 대한 액세스 권한을 부여하지 않지만, 그 자신을 추적하는만큼 쉽게 :

let i = 0; 
for (let element of collection) { 
    // do something with element 
    if (someCondition) { 
     break; 
    } 
    i++; 
} 

당신도 할 수 있습니다 How to short circuit Array.forEach like calling break을 읽으십시오. 그것은 당신이 사용하고자하는 모든 컬렉션과 함께 작업을해야하는 for...of을 포함하여 몇 가지 솔루션을 나열이

  • 사용 .some()return true 휴식 휴식 예외를

    • try의 루프 던져
  • +1

    내 의견을 삭제하는 중입니다. 그들은이 대답에 아무 것도 추가하지 않습니다. :-) – PatS

    0

    크기를 반환하는 길이 함수가있는 사용자 고유의 목록을 프로토 타입하고 만들 수 있습니다. 또한 배열에서 forEach 메서드의 프로토 타입을 통해 재정의 할 수도 있습니다.

    내가 생각할 수있는 유일한 방법은 슈퍼 클린이 아니라 객체를 반복하는 함수를 호출하기 전에 객체의 길이 또는 크기를 가져 와서 매개 변수로 전송하는 것입니다.