javascript - ramda 从基础对象重塑对象结构
问题描述
我确信可以获取一个对象并对其进行修改并过滤它以获得另一种形状,以便在 api 请求后更容易使用,但不幸的是,我无法创建任何不涉及使用的优雅解决方案path
和prop
每个键例如。
const { prop, path } = R
const baseObject = {
id: 1,
name: 'object-one',
info: {
items: [
{ name: 'item-one', url: '/images/item-one.jpg' },
]
},
}
const newObj = {
id: prop('id', baseObject),
name: prop('name', baseObject),
// image is a new prop not found on the base object
image: path(['info', 'items', 0, 'url'], baseObject),
}
console.log(newObj)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
<script src="https://codepen.io/synthet1c/pen/KyQQmL.js"></script>
谁能告诉我是否有办法进行优雅的无点对象重塑。似乎应该有一些映射器函数可以将基础对象作为种子,但我似乎无法确定它。
我试过evolve
了,但这并没有增加新的点,我试过lens
了,但我可能错过了文档中的一些内容,因为我只能修改现有的键或像使用prop
.
干杯,
编辑。我能够创建一个可以完成这项工作的映射函数,但是有更好的方法吗?
const { prop, path, toUpper, map, compose } = R
const baseObject = {
id: 1,
name: 'object-one',
info: {
items: [
{ name: 'item-one', url: '/images/item-one.jpg' },
]
},
}
// createObjectFromSpec :: { k: f(a) } -> a -> { k: b }
const createObjectFromSpec = spec => baseObj => R.map(f => f(baseObj), spec);
const createObjectTypeOne = createObjectFromSpec({
id: prop('id'),
name: prop('name'),
// image is a new prop not found on the base object
image: path(['info', 'items', 0, 'url']),
})
const createObjectTypeTwo = createObjectFromSpec({
id: prop('id'),
name: prop('name'),
// image is a new prop not found on the base object
itemName: path(['info', 'items', 0, 'name']),
})
console.log(
createObjectTypeOne(baseObject)
)
console.log(
createObjectTypeTwo(baseObject)
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
<script src="https://codepen.io/synthet1c/pen/KyQQmL.js"></script>
解决方案
createObjectFromSpec
您在示例中拥有的功能在 Ramda 中存在为applySpec
.
const fn = R.applySpec({
id: R.prop('id'),
name: R.prop('name'),
image: R.path(['info', 'items', 0, 'url'])
})
const result = fn({
id: 1,
name: 'object-one',
info: {
items: [
{ name: 'item-one', url: '/images/item-one.jpg' },
]
},
})
console.log(result)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
推荐阅读
- javascript - 尝试将请求作为表单数据发送时显示错误
- php - 有没有办法在 php 中回显“×tamp”?
- java - 为什么我的 Android 应用程序的 Java 代码会生成 2 个线程?
- nginx - Nginx status is failed 那么如何使 nginx 启动并运行
- python - 赋值前引用的局部变量“i”
- spring-boot - 无法确定 org.springframework.boot:spring-boot-starter-parent 的工件:
- android - 如何通过 Google Play 跟踪应用程序网站上的按钮点击到 Android 应用程序中的应用程序内购买?
- php - Laravel 事件未显示在 Websockets 仪表板上
- azure - 在 ADF 上将列拆分为行
- php - 致命错误:未捕获的错误:C:\xampp\htdocs\imagebob\google-drive.php:41 中未定义的常量“STDIN”