Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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
Ramda.js 如何使用ramdajs同时更改多个值_Ramda.js - Fatal编程技术网

Ramda.js 如何使用ramdajs同时更改多个值

Ramda.js 如何使用ramdajs同时更改多个值,ramda.js,Ramda.js,我是拉姆达斯的新手。 假设我有一个对象: {a: 1, b: 2, c: 3} 我可以将a更改为11: const aLens = R.lensProp('a'); R.set(aLens, 11, {a: 1, b: 2, c: 3}); 如何通过一次通话将a换成11,将b换成22?好吧,你不能用隐形眼镜。透镜聚焦于数据结构的单个部分 拉姆达的力量: 但是我认为你需要在一个电话中考虑你的意思。Ramda提供了和以及一些更模糊的替代方案,允许您通过几个调用构建单个函数。如果您调用生成

我是拉姆达斯的新手。 假设我有一个对象:

{a: 1, b: 2, c: 3}
我可以将a更改为11:

  const aLens = R.lensProp('a');
  R.set(aLens, 11, {a: 1, b: 2, c: 3});

如何通过一次通话将a换成11,将b换成22?

好吧,你不能用隐形眼镜。透镜聚焦于数据结构的单个部分

拉姆达的力量:

但是我认为你需要在一个电话中考虑你的意思。Ramda提供了和以及一些更模糊的替代方案,允许您通过几个调用构建单个函数。如果您调用生成的函数,您仍然在进行单个调用,但实际上,您正在调用管道中包含的所有函数

因此,

const fn = pipe(
  set(lensProp('a'), 11),
  set(lensProp('b'), 22)
);
fn({a: 1, b: 2, c: 3}); //=> {a: 11, b: 22, c: 3}

但这是fn的问题。

好吧,你不能真的用镜头做到这一点。透镜聚焦于数据结构的单个部分

拉姆达的力量:

但是我认为你需要在一个电话中考虑你的意思。Ramda提供了和以及一些更模糊的替代方案,允许您通过几个调用构建单个函数。如果您调用生成的函数,您仍然在进行单个调用,但实际上,您正在调用管道中包含的所有函数

因此,

const fn = pipe(
  set(lensProp('a'), 11),
  set(lensProp('b'), 22)
);
fn({a: 1, b: 2, c: 3}); //=> {a: 11, b: 22, c: 3}

但这是fn的问题。

如果只需要使用已知值更新键,一个选项是使用:

如果需要根据对象的现有值更新对象,则可以使用

您也可以将其创建为镜头,但除非您计划将其与其他镜头组合,否则与上述选项相比的好处是值得怀疑的

const projectLens = keys => R.lens(R.pick(keys), R.flip(R.merge))

const abLens = projectLens(['a', 'b']);

R.set(abLens, { a: 11, b: 22 }, obj) //=> {"a": 11, "b": 22, "c": 3}
R.view(abLens, obj) //=> {"a": 1, "b": 2}

如果只需要使用已知值更新键,一个选项是使用:

如果需要根据对象的现有值更新对象,则可以使用

您也可以将其创建为镜头,但除非您计划将其与其他镜头组合,否则与上述选项相比的好处是值得怀疑的

const projectLens = keys => R.lens(R.pick(keys), R.flip(R.merge))

const abLens = projectLens(['a', 'b']);

R.set(abLens, { a: 11, b: 22 }, obj) //=> {"a": 11, "b": 22, "c": 3}
R.view(abLens, obj) //=> {"a": 1, "b": 2}

事实上,有一种方法可以用镜头做到这一点,但在这样的位置使用镜头可能不是最好的选择

逻辑上,R.set返回整个对象。因此,它可以重复几个时间链来执行您需要的任务:

const aLens = R.lensProp('a');
const bLens = R.lensProp('b');
R.set(bLens, 22)(R.set(aLens, 11)({a: 1, b: 2, c: 3}));
或者为了更好的可视化:

const aLens = R.lensProp('a');
const bLens = R.lensProp('b');
R.compose(R.set(bLens, 22), R.set(aLens,11))({a: 1, b: 2, c: 3});

事实上,有一种方法可以用镜头做到这一点,但在这样的位置使用镜头可能不是最好的选择

逻辑上,R.set返回整个对象。因此,它可以重复几个时间链来执行您需要的任务:

const aLens = R.lensProp('a');
const bLens = R.lensProp('b');
R.set(bLens, 22)(R.set(aLens, 11)({a: 1, b: 2, c: 3}));
或者为了更好的可视化:

const aLens = R.lensProp('a');
const bLens = R.lensProp('b');
R.compose(R.set(bLens, 22), R.set(aLens,11))({a: 1, b: 2, c: 3});

您可以使用“合并”和“咖喱”来执行此操作:

curry(merge(__, {a:11, b:22}))({a:1, b:2, c:3});
我更喜欢使用以下util函数:

const overwrite = R.curry((over, org) => R.merge(R.__, over)(org));

overwrite({a:11, b:22}, {a:1, b:2, c:3});

您可以使用“合并”和“咖喱”来执行此操作:

curry(merge(__, {a:11, b:22}))({a:1, b:2, c:3});
我更喜欢使用以下util函数:

const overwrite = R.curry((over, org) => R.merge(R.__, over)(org));

overwrite({a:11, b:22}, {a:1, b:2, c:3});

+1个用于投影镜头。我不知道这对我个人有多大用处,但我喜欢看看如何相对容易地完成。你知道合并是否比管道/合成镜头快吗?projectLens是管道透镜的另一种方式吗?因为我现在使用R.merge来解决当前的问题。我将此设置为可接受的答案。如果您不需要将镜头组合在一起,则直接使用R.merge会更快。这是因为在这里显示的示例中,projectLens最终也将使用R.merge,所以它不能再快了。我相信projectLens实现的键前面还有一个额外的R。我的意思是它应该是:const projectLens=keys=>R.lensR.pickkeys,R.flipR.merge,就我个人而言,我更喜欢为setter设置更具防御性的东西,比如const projectLens=keys=>R.lensR.pickkeys,x,s=>R.merges,R.pickkeys,x+1表示projectLens。我不知道这对我个人有多大用处,但我喜欢看看如何相对容易地完成。你知道合并是否比管道/合成镜头快吗?projectLens是管道透镜的另一种方式吗?因为我现在使用R.merge来解决当前的问题。我将此设置为可接受的答案。如果您不需要将镜头组合在一起,则直接使用R.merge会更快。这是因为在这里显示的示例中,projectLens最终也将使用R.merge,所以它不能再快了。我相信projectLens实现的键前面还有一个额外的R。我的意思是,它应该是:const projectLens=keys=>R.lensR.pickkeys,R.flipR.merge,就我个人而言,我更喜欢为setter设置一些更具防御性的东西,比如const projectLens=keys=>R.lensR.pickkeys,x,s=>R.merges,R.pickkeys,xd你知道使用evolve和pipe之间是否有性能差异吗?@techguy2000:我不知道。我只会担心,如果我测试并发现这是我的代码中的一个瓶颈。。。这看起来不太可能。这是有道理的。谢谢你回答我最初的问题,并给了我深刻的见解!你知道使用evolve和pipe在性能上有什么不同吗?@techguy2000:我不知道。我只会担心,如果我测试并发现这是我的代码中的一个瓶颈。。。这在这里似乎不太可能。
好啊这是有道理的。谢谢你回答我最初的问题,并给了我深刻的见解!