Javascript redux:使用不可变方法修改数组中对象的性能属性。利弊
在我对函数式编程方式以及在特定数组发生更改时在redux中生成下一个状态的基本理解中,我一直在尝试通过索引在todo列表中修改todo项的这种方法:Javascript redux:使用不可变方法修改数组中对象的性能属性。利弊,javascript,arrays,redux,immutability,Javascript,Arrays,Redux,Immutability,在我对函数式编程方式以及在特定数组发生更改时在redux中生成下一个状态的基本理解中,我一直在尝试通过索引在todo列表中修改todo项的这种方法: const toggleSelectedTodo = (todos, selectedIndex) => { return todos.map((todo, index) => ( { ...todo, completed: index === selectedIndex ? !todo.completed :
const toggleSelectedTodo = (todos, selectedIndex) => {
return todos.map((todo, index) => (
{ ...todo, completed: index === selectedIndex ? !todo.completed : todo.completed }
))
}
export default function reducer(state = INITIAL_STATE, action) {
switch (action.type) {
...
case "TOGGLE_SELECTED":
return {
...state,
todos: toggleSelectedTodo(state.todos, action.index)
}
...
default:
return state
}
}
所以,我的想法是,我需要重新映射所有todo项对象,除了目标项之外,这些对象保持它们的值。但是,我认为这不符合性能,我担心大型阵列的性能以及最坏的情况
您知道在数组中修改对象属性的更好策略吗?这是正确的方法吗?您应该只修改具有选定索引的对象。数组中的每个对象都不需要使用“扩展”操作符。这可能是潜在的性能瓶颈。为避免您的
toggleSelectedTodo
函数如下所示:
const toggleSelectedTodo = (todos, selectedIndex) => {
return todos.map((todo, index) => {
if(index === selectedIndex) {
return { ...todo, completed: !todo.completed }
}
return todo
})
}
除此之外,您不应该担心性能,除非您正在处理数千项。您应该只修改具有选定索引的对象。数组中的每个对象都不需要使用“扩展”操作符。这可能是潜在的性能瓶颈。为避免您的
toggleSelectedTodo
函数如下所示:
const toggleSelectedTodo = (todos, selectedIndex) => {
return todos.map((todo, index) => {
if(index === selectedIndex) {
return { ...todo, completed: !todo.completed }
}
return todo
})
}
除此之外,您不应该担心性能,除非您正在处理成千上万的项目。在性能真正成为问题之前,绝对不要担心性能。然后,也只有到那时,你才应该使用一些分析工具来找出事情进展缓慢的原因。在它真正成为问题之前,绝对不要担心性能。然后,也只有到那时,你才应该使用一些分析工具来找出事情进展缓慢的原因。