【问题标题】:Ramda: find object key by nested key valueRamda:通过嵌套键值查找对象键
【发布时间】:2018-01-30 22:15:44
【问题描述】:

ramda 中是否有任何功能,如何通过嵌套键值找到键?我找到了一种如何在数组中查找对象的方法,但这无济于事。我需要这样的东西:

const obj = {
  addCompany: {
    mutationId: '1'
  },
  addUser: {
    mutationId: '2'
  },
  addCompany: {
    mutationId: '3'
  }
}
const findByMutationId = R.???
findByMutationId('2', obj) // returns addUser

【问题讨论】:

    标签: javascript functional-programming ramda.js


    【解决方案1】:

    不确定 ramda,但如果纯 js 中的单行代码对您有好处,以下将起作用

    const obj = {
        addCompany: {
            mutationId: '1'
        },
        addUser: {
            mutationId: '2'
        }
    };
    
    let found = Object.keys(obj).find(e => obj[e].mutationId === '2');
    console.log(found);

    【讨论】:

    • Object.values 会简化一点。
    【解决方案2】:

    如果你打算使用它,那么你可能需要填充条目,如果你需要键和值,这很好

    const obj = {
      addCompany: {
        mutationId: '1'
      },
      addUser: {
        mutationId: '2'
      },
      addCompany: {
        mutationId: '3'
      }
    }
    
    let [key, val] = Object.entries(obj).find(obj => obj[1].mutationId == '2')
    
    console.log(key)
    console.log(val)

    【讨论】:

      【解决方案3】:

      find 结合 propEqkeys 应该可以工作

      const obj = {
        addCompany: {
          mutationId: '1'
        },
        addUser: {
          mutationId: '2'
        },
        addCompany2: {
          mutationId: '3'
        }
      }
      const findByMutationId = id => obj => R.find(
        R.o(R.propEq('mutationId', id), R.flip(R.prop)(obj)),
        R.keys(obj)
      )
      
      console.log(findByMutationId('2')(obj))
      <script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.24.1/ramda.min.js"></script>

      Pointfree 版本lulz

      const obj = {
        addUser: {
          mutationId: '2'
        },
        addCompany: {
          mutationId: '3'
        }
      }
      
      const findByMutationId = R.compose(
        R.o(R.head),
        R.o(R.__, R.toPairs),
        R.find,
        R.o(R.__, R.nth(1)),
        R.propEq('mutationId')
      )
      
      console.log(findByMutationId('2')(obj))
      
      const findByMutationId2 = R.compose(
        R.ap(R.__, R.keys),
        R.o(R.find),
        R.o(R.__, R.flip(R.prop)),
        R.o,
        R.propEq('mutationId')
      )
      
      console.log(findByMutationId2('3')(obj))
      <script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.24.1/ramda.min.js"></script>

      【讨论】:

        猜你喜欢
        • 2017-01-28
        • 2019-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-19
        • 1970-01-01
        • 1970-01-01
        • 2016-01-19
        相关资源
        最近更新 更多