Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript redux:使用不可变方法修改数组中对象的性能属性。利弊_Javascript_Arrays_Redux_Immutability - Fatal编程技术网

Javascript redux:使用不可变方法修改数组中对象的性能属性。利弊

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 :

在我对函数式编程方式以及在特定数组发生更改时在redux中生成下一个状态的基本理解中,我一直在尝试通过索引在todo列表中修改todo项的这种方法:

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
    })
}

除此之外,您不应该担心性能,除非您正在处理成千上万的项目。

在性能真正成为问题之前,绝对不要担心性能。然后,也只有到那时,你才应该使用一些分析工具来找出事情进展缓慢的原因。在它真正成为问题之前,绝对不要担心性能。然后,也只有到那时,你才应该使用一些分析工具来找出事情进展缓慢的原因。