2016-06-07 43 views
0

我正在尝试关注todo-app的反应。 我正在写“更新所有已完成”功能,不断变化。更新javascript中对象值的功能方式

而在终极版todomvc例如,待办事项是阵列

state = [{id: 1, text: "Read flux", completed: false}, ...] 

所以使用此方法

const areAllMarked = state.every(todo => todo.completed) 
return state.map(todo => Object.assign({}, todo, { 
    completed: !areAllMarked 
})) 

https://github.com/reactjs/redux/blob/master/examples/todomvc/reducers/todos.js

但我使用待办事项像{ID的对象:待办事项}

state = {1: {text: "Read flux", completed: false}, ...} 

那么,是否有任何适当的,功能方式获取更新对象Object.assign

+1

我推荐immutable.js –

+0

可能的重复[如何循环或枚举JavaScript对象?](http://stackoverflow.com/questions/684672/how-do-i-loop-through-or-enumerate -a-javascript-object) –

回答

0

我会推荐对象传播运算符。这是ES7规范的一部分,因此请确保安装了相应的babel plugin。 这段代码利用了传播经营者,并呼吁嵌套的待办事项减速,这是负责的改变单一的待办事项(代码丹Abramovs egghead tutorial):

const byId = (state = {}, action) => { 
    switch (action.type) { 
    case 'ADD_TODO': 
    case 'TOGGLE_TODO': 
     return { 
     ...state, 
     [action.id]: todo(state[action.id], action), 
     }; 
    default: 
     return state; 
    } 
}; 

嵌套的减速可能看起来像:

const todo = (state, action) => { 
    switch (action.type) { 
    case 'ADD_TODO': 
     return { 
     id: action.id, 
     text: action.text, 
     completed: false, 
     }; 
    case 'TOGGLE_TODO': 
     if (state.id !== action.id) { 
     return state; 
     } 
     return { 
     ...state, 
     completed: !state.completed, 
     }; 
    default: 
     return state; 
    } 
}; 
+2

它实际上并不是规范的一部分。它处于提案阶段(阶段2)。 https://github.com/sebmarkbage/ecmascript-rest-spread – ctrlplusb

0

我使用了一个很酷的不变性辅助函数库timm

确实有助于做基于非突变的更新,而不必在代码中更改太多(如使用Immutable.js时)。它做得很快,很好。

下面是使用您的代码示例的实现:

import timm from 'timm'; 

const updatedState = timm.setIn(state, ['1', 'completed'], true); 

Immutability.js远强,并且经常被推荐为JS不可改变的事实库,但它是一个相当分量库和品牌你以非本地方式访问你的对象/数组,所以你会失去一些很酷的东西,比如解构。

我不是敲Imutability.js,在我看来它可能是市场上最强大的,但有时你不需要一个完整的电锯,当一个简单的刀会做。从具有低摩擦和低成本的东西开始,当你发现一个更强大的工具可以解决的问题时,按照你的方式在堆栈上工作。