2016-06-25 1 views
0

У меня есть коллекция Immutable.js, которая выглядит следующим образом:методов Chaining Immutable.js с глубоко вложенными Maps/Списки

{ groups: Immutable.Map({ 
    { 
     id: 1, 
     members: Immutable.List 
    },{ 
     id: 2, 
     members: Immutable.List 
    } 
    }) 
} 

я получаю обновленные член массива и идентификатор группы от моего сервера. Как найти правильную группу по идентификатору, а затем обновить опору членов, а затем вернуть новую коллекцию groups?

У меня есть что-то подобное до сих пор, что не работает.

return state.update('groups', groups => { 
    for (let group of groups) { 
    if (group.id === action.id) { 
     group.members = Immutable.fromJS(action.members); 
     // not sure what I would do with updated here 
     //const updated = group.members.set('members', action.members); 
    } 
    } 

    return groups; 
}; 

Кроме того, попробовал это, и это, кажется, не закончить, потому что console.log никогда не срабатывает.

let update = state.get('groups') 
         .find(group => group.id === action.id) 
         .set('members', action.members) 
    console.log(update) // nothing, no error either 

следующие работы, но должны быть лучше, более элегантным способом, чем использование fromJS, а затем toJS.

return state.update('groups', groupsImmutable => { 
    const groups = groupsImmutable.toJS(); 
    for (let group of groups) { 
    if (group.id === activeId) { 
     group.members = action.members; 
     break; 
    } 
    } 

    return Immutable.fromJS(groups); 
}); 

спасибо!

+0

Выполняет ли это 'return state.setIn (['groups', action.id, 'members'], action.members)'? –

+0

@JeremyS. Это не сработало. Я закончил использовать последний вариант – Yoshi

ответ

0

Это будет работать:

return state.update('groups', groups => { 
    return groups.map(group => { 
     if (group.get('id') === action.id) { 
      return group.set('members', Immutable.fromJS(action.members)) 
     } else { 
      return group 
     } 
    }) 
}) 

Вы также можете использовать findIndex, чтобы получить индекс соответствия идентификатору группы, а затем использовать setIn обновить массив членов:

const updateIndex = state.get('groups').findIndex(group => group.get('id') === action.id); 
if (updateIndex === -1) { // action.id not found 
    return state; 
} else { 
    return state.setIn(['groups',updateIndex,'members'], Immutable.fromJS(action.members)) 
} 

Ваши примеры не удалось, потому что вы пытались напрямую модифицировать дочерний элемент, это не то, как работает Immutable. Вам нужно обновить весь объект состояния новым элементом.