2016-10-28 2 views
0

나는 변경할 수없는 다차원 배열을 가지고 있습니다. 그러나 나는 아직도 내가 어떻게 다차원 불변 객체로 작업 해야하는지 잘 모르겠다.복잡한 불변 객체로 작업하기

// data 
{ 
    // item 
    { 
     name: someName, 
     todos: [ 
      { id: 1, name: todoName }, 
      { id: 2, name: todoName2 } 
     ] 
    } 
} 

가 어떻게 수행 할 작업의 고유 한 목록을 추출 할 수 있습니다 :

내가이 유사한 구조를 가지고 있다고하자? 전 쉽게 만드는 도서관 - Immutable.js 대 JS에서 사용할 수있는 기술 - immutability :

// Saving todos 
let uniqueTodos = [] 
// Saving ids of todos 
let saved = [] 

// I want to make data immutable list 
data.forEach(item => { 
    item.todos.forEach(todo => { 
    if (saved.indexOf(todo.id) === -1) { 
     saved.push(todo.id) 
     todos.push(todo) 
    } 
    }) 

}) 
return todos 
+0

내 질문을 편집했습니다. – Michal

+1

필터 프로토 타입 메서드를 사용하여 살펴보기 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter 고유 한 개체를 처리하는 방법에 대해서는 이름 . 배열에 ToDo를 추가하기 전에 실제로 이름이 이미 존재하는지 확인하기 위해 반복하십시오. 그것은 최적이 아니지만 작동합니다. 속도가 필요한 경우 todos를 저장하기 위해 다른 데이터 구조를 고려하십시오. –

답변

3

나는 당신이 두 개의 관련 개념을 혼동 생각합니다.

여기 (JS 세트가 유효로 약간 수정되고 중복 TODO를 포함) 모두의 예 :

const data = { 
 
    item: { 
 
    name: 'someName', 
 
    todos: [ 
 
     { id: 1, name: 'todoName' }, 
 
     { id: 2, name: 'todoName2' }, 
 
     { id: 2, name: 'todoName2' }, 
 
    ], 
 
    }, 
 
} 
 

 

 
console.info(
 
    'immutable unique todos:', 
 
    data.item.todos.map((todo) => ({ ...todo, })) 
 
) 
 

 
console.info(
 
    'Immutable.js unique todos:', 
 
    Immutable.fromJS(data).getIn(['item', 'todos']).toSet().toJS() 
 
)
<script src="https://cdn.jsdelivr.net/immutable.js/3.8.1/immutable.min.js"></script>

Immutable.js docs.

관련 문제