Ramda applySpec - 保留未修改的道具
Ramda applySpec - keep unmodified props
假设我有一个对象 const foo = { a: 1, b: 2 }
,我想添加一个基于 b 的道具 c。
我能做到:
applySpec({
a: prop('a'),
b: prop('b'),
c: ({ b }) => b + 1
}, foo)
并得到一个像这样的对象:{ a: 1, b: 2, c: 3 }
有更好的方法吗?
我看过 evolve、assoc 和 applySpec,但其中 none 似乎符合目的。
您可以使用 R.chain 创建一个应用规范的函数,然后将新对象与原始对象合并。
如果 R.chain 与函数 (f
& g
) 一起使用:
chain(f, g)(x)
等同于 f(g(x), x)
在这种情况下 chain(mergeLeft, applySpec({}))
等于 mergeLeft(applySpec({}), originalObject)
。
const { chain, mergeLeft, applySpec } = R
const fn = chain(mergeLeft, applySpec({
c: ({ b }) => b + 1
}))
const foo = { a: 1, b: 2 }
const result = fn(foo)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>
您可以通过使用 R.pipe 将柯里化的 R.applySpec 传递给链,使其成为允许添加到现有对象的通用函数:
const { pipe, chain, mergeLeft, applySpec } = R
const fn = pipe(applySpec, chain(mergeLeft))
const addCProp = fn({
c: ({ b }) => b + 1
})
const foo = { a: 1, b: 2 }
const result = addCProp(foo)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>
假设我有一个对象 const foo = { a: 1, b: 2 }
,我想添加一个基于 b 的道具 c。
我能做到:
applySpec({
a: prop('a'),
b: prop('b'),
c: ({ b }) => b + 1
}, foo)
并得到一个像这样的对象:{ a: 1, b: 2, c: 3 }
有更好的方法吗?
我看过 evolve、assoc 和 applySpec,但其中 none 似乎符合目的。
您可以使用 R.chain 创建一个应用规范的函数,然后将新对象与原始对象合并。
如果 R.chain 与函数 (f
& g
) 一起使用:
chain(f, g)(x)
等同于 f(g(x), x)
在这种情况下 chain(mergeLeft, applySpec({}))
等于 mergeLeft(applySpec({}), originalObject)
。
const { chain, mergeLeft, applySpec } = R
const fn = chain(mergeLeft, applySpec({
c: ({ b }) => b + 1
}))
const foo = { a: 1, b: 2 }
const result = fn(foo)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>
您可以通过使用 R.pipe 将柯里化的 R.applySpec 传递给链,使其成为允许添加到现有对象的通用函数:
const { pipe, chain, mergeLeft, applySpec } = R
const fn = pipe(applySpec, chain(mergeLeft))
const addCProp = fn({
c: ({ b }) => b + 1
})
const foo = { a: 1, b: 2 }
const result = addCProp(foo)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>