Javascript 代价高昂的不可变操作

Javascript 代价高昂的不可变操作,javascript,reactjs,redux,immutability,Javascript,Reactjs,Redux,Immutability,我有一个处于redux状态的数据,它有大约100000条json记录(每条记录有大约8个键值对) 我在客户端编写了一个逻辑,每30秒刷新一次数据(每30秒我向服务器打一个电话,获取要删除的记录和要添加的记录) 我在我的reducer函数中进行了这个处理,为此我编写了一个方法“mergeUpdates”,它迭代state.data对象来标识要删除的内容和要插入的内容 我使用了fromJs(state.data).toJsfrom immutable来克隆state.data并进行更新(state.

我有一个处于redux状态的数据,它有大约100000条json记录(每条记录有大约8个键值对)

我在客户端编写了一个逻辑,每30秒刷新一次数据(每30秒我向服务器打一个电话,获取要删除的记录和要添加的记录)

我在我的reducer函数中进行了这个处理,为此我编写了一个方法“mergeUpdates”,它迭代state.data对象来标识要删除的内容和要插入的内容

我使用了
fromJs(state.data).toJs
from immutable来克隆state.data并进行更新(state.data不是不可变的)。但这次克隆的成本非常高(100000条记录大约需要2秒钟),因此我删除了克隆并开始修改state.data本身,这导致了“Assignment to function parameter”lint错误,因为我正在修改传递给函数的数据

initialState = {
  data: {}
}

doSomething(state, change) {
    // iterates on state and updates state
    state = doSomethingElse();
    return state;
}

mergeUpdates(state, change) {
   // some logic
   state = doSomething(state, change)

   // some more logic
   return state;
}


export default function (state=initialState, action) {
    switch (action.type) {
        case REFRESH: {
            return mergeUpdates(state.data, action.data)
        }
    }
}
处理这种情况的最佳实践是什么?我应该在“mergeUpdates”和“doSomething”方法中将状态分配给一个新引用并返回一个新引用,还是将状态中的数据设置为不可变的或其他什么

例如:这被认为是一种好的做法吗

doSomething(state, change) {
    let newState = state; 

    // process change and return newState

    return newState; 
}

mergeUpdates(state, change) {
    let newState = state;

    // apply change on newState 
    newState = doSomething(newState, change);

   // return newState
   return newState;

}

Redux本身并不强制用户使用普通对象进行状态管理。您可以使用immutable对象来存储数据,您需要做的唯一一件事就是像上面所做的那样,通过fromJS重新初始化全新的状态。
此外,immutable必须在整个应用程序中使用。实际上,如果数据结构不复杂,而不是繁琐的不可变的,我建议您使用扩展运算符来修改数据。(对我来说,树下超过3层是很复杂的)

Redux本身并不强制用户使用普通对象进行状态管理。您可以使用immutable对象来存储数据,您需要做的唯一一件事就是像上面所做的那样,通过fromJS重新初始化全新的状态。
此外,immutable必须在整个应用程序中使用。实际上,如果数据结构不复杂,而不是繁琐的不可变的,我建议您使用扩展运算符来修改数据。(对我来说,树下超过3层是很复杂的)

应该尽量避免使用Immutable.js的
toJS()
fromJS()
函数。根据作者李·拜伦的说法

我建议找一个不同的方法。一些建议:

  • 如果您的数据已经在Immutable.js中,请使用它提供的其他函数来帮助更新该数据(例如
    Map.WithTranslations()
  • 如果该数据不在Immutable.js中,或者您希望避免使用它,那么您可能需要查看,其中一些是专门用于帮助将新值合并到现有数据结构中的

您应该尽量避免使用Immutable.js的
toJS()
fromJS()
函数。根据作者李·拜伦的说法

我建议找一个不同的方法。一些建议:

  • 如果您的数据已经在Immutable.js中,请使用它提供的其他函数来帮助更新该数据(例如
    Map.WithTranslations()
  • 如果该数据不在Immutable.js中,或者您希望避免使用它,那么您可能需要查看,其中一些是专门用于帮助将新值合并到现有数据结构中的

Mm最佳实践,或者:处理处理服务器端并在前端使用小状态,或者使用可变状态,例如尝试Mobx(我对react状态管理的偏好),谢谢,但我已经在使用Redux进行状态管理。所以我不认为需要mobX。你试过npm软件包吗?可能比克隆到json更快?否则,我强烈建议不要在frontend.Mm中使用100.000行最佳实践,或者:处理处理服务器端并在frontend中使用小状态,或者使用可变状态,例如尝试Mobx,(我对react状态管理的偏好)谢谢,但我已经在使用Redux进行状态管理。所以我不认为需要mobX。你试过npm软件包吗?可能比克隆到json更快?否则我强烈建议不要在前端使用100000行。