首页 > 解决方案 > ramda 从基础对象重塑对象结构

问题描述

我确信可以获取一个对象并对其进行修改并过滤它以获得另一种形状,以便在 api 请求后更容易使用,但不幸的是,我无法创建任何不涉及使用的优雅解决方案pathprop每个键例如。

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>

标签: javascriptjsonobjectramda.js

解决方案


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>


推荐阅读