gpt4 book ai didi

javascript - 更改 js 函数参数的引用

转载 作者:行者123 更新时间:2023-11-29 18:46:37 25 4
gpt4 key购买 nike

最近我编写了 react-redux 应用程序,作为一名 React 开发人员,我编写了纯粹的、函数式的和可预测的代码。尽管我确实喜欢这种体验,但我怀疑我的代码是否仍然很漂亮。

所以我的状态中有一棵树,我需要更新树中的一堆节点。假设树的 API 提供了一个 pure 方法 pureUpdate(path, newNode, tree) => newTree,它返回更新了节点的新树。在这种情况下,我的 reducer 方法可能看起来像

function updateNodes(tree, updateRules) {
updateRules.forEach(updateRule => {
const { path, node } = updateRule;
tree = pureUpdate(path, node, tree);
});
return tree;
}

但我不确定这是否是最好的。

第一个看起来很讨厌的是 tree = pureUpdate(path, node, tree);。它看起来像改变一个参数,这是不鼓励的,但我只是重新分配引用,不是吗?解释了here在答案的第二部分。但是,尽管这个技巧可能没问题,in this discussion表示此类代码可能未优化,重新分配参数可能会导致性能问题(more info with examples)。我想到的最简单的解决方法是使用一个额外的变量,它将是树的克隆。

function updateNodes(tree, updateRules) {
let newTree = someCloneFunc(tree);
updateRules.forEach(updateRule => {
const { path, node } = updateRule;
newTree = pureUpdate(path, node, newTree);
});
return newTree;
}

问题是如果我没有遗漏任何东西并且我的代码仍然是纯净的、漂亮的并且不会引起任何问题。

最佳答案

如果您完全关心性能,我不会克隆 tree只是为了避免重新分配参数。

虽然您可以使用 forEach在这里重新分配参数,reduce是您用例的正确功能抽象,它通常比 forEach 更好、更有用。因为它可以(而且应该)纯粹使用,而 forEach总是与副作用有关。

基于reduce的解决方案是否克隆和/或重新分配函数参数的问题也完全没有实际意义。

这是一个有效的 reduce解决方案 - 没有参数重新分配,没有 forEach副作用和没有理由克隆 tree :

const updateNodes = (tree, updateRules) =>
updateRules.reduce(
(acc, { path, node }) => pureUpdate(path, node, acc),
tree // initialize acc (the accumulator)
)

关于javascript - 更改 js 函数参数的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53374396/

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