代码之家  ›  专栏  ›  技术社区  ›  synthet1c

ramda从基对象重塑对象结构

  •  1
  • synthet1c  · 技术社区  · 7 年前

    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 支柱 .

    干杯,

    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”></脚本>
    1 回复  |  直到 7 年前
        1
  •  3
  •   Scott Christopher    7 年前

    这个 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>