gpt4 book ai didi

javascript - CoSTLy 不可变操作

转载 作者:行者123 更新时间:2023-12-01 02:11:31 27 4
gpt4 key购买 nike

我的 redux 状态中有一个数据,大约有 100,000 个 json 记录(每个记录都有大约 8 个键值对)。

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

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

我使用 immutable 中的 fromJs(state.data).toJs 来克隆 state.data 并进行更新(state.data 不是不可变的)。但事实证明,这种克隆是非常昂贵的操作(100,000 条记录大约需要 2 秒),因此我删除了克隆并开始修改 state.data 本身,这导致了“分配给函数参数”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;

}

最佳答案

您应该尽可能避免使用 Immutable.js 的 toJS()fromJS() 函数。根据其作者 Lee Byron,this are the most expensive operations in the library .

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

  • 如果您的数据已在 Immutable.js 中,请使用它提供的其他函数来帮助更新该数据(例如 Map.withMutations())
  • 如果该数据尚未存在于 Immutable.js 中,或者您想避免使用它,您可能需要查看 one of the many immutable update libraries available ,其中一些专门用于帮助将新值合并到现有数据结构中。

关于javascript - CoSTLy 不可变操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49729986/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com