Javascript/Ramda: 如何使下面的代码起作用

Javascript/Ramda: How to make the following code functional

您好,我有以下对象结构,

const usersList = {
  NFr9F4WbBxR4H5ajolbS6q0skPF2: {
    name: "justin davidson",
    uid: "NFr9F4WbBxR4H5ajolbS6q0skPF2"
  },
  asas9F4WbBxR4H5ajolbS6q0sasF2: {
    name: "sawyer davidson",
    uid: "asas9F4WbBxR4H5ajolbS6q0sasF2"
  }
}

它有一个用户 ID 作为键,它是嵌套在其中的用户对象。我想存储内部用户数据。我一直在使用 Ramda JS,并通过以下方式做到了这一点,

let x = []
const y = R.keys(usersList).forEach((uid) => {  
  x.push(usersList[uid])
  return x
})

哪个returns

[{"name":"justin davidson","uid":"NFr9F4WbBxR4H5ajolbS6q0skPF2"},    
{"name":"sawyer davidson","uid":"asas9F4WbBxR4H5ajolbS6q0sasF2"}]

..但是我想以纯功能的方式实现相同的目的。这里最好的方法是什么?我猜是 compose and map,但我似乎无法计算出来。找个小方向。

谢谢

只需使用 map 而不是 forEach:

const x = R.keys(usersList).map((uid) => usersList[uid])

看起来还有一个 values 方法可以满足您的需求:

const x = R.values(usersList)

某些库中并不总是有一个函数可以完全按照您的要求执行。展示如何自己做事表明,当您遇到问题并且找不到神奇的功能来为您解决问题时,您不必感到 "stuck"。一旦您了解了该功能的存在,当然,请继续并用内置的功能替换您的自制解决方案。但在那之前,不要害怕编写代码并继续前进。

// ovalues :: (Object k:v) -> [v]
const ovalues = o =>
  Array.from(Object.keys(o), k => o[k])

const usersList = {
  NFr9F4WbBxR4H5ajolbS6q0skPF2: {
    name: "justin davidson",
    uid: "NFr9F4WbBxR4H5ajolbS6q0skPF2"
  },
  asas9F4WbBxR4H5ajolbS6q0sasF2: {
    name: "sawyer davidson",
    uid: "asas9F4WbBxR4H5ajolbS6q0sasF2"
  }
}

console.log(ovalues(usersList))

是的,R.values 确实存在于 Rambda 库中,但下次不要害怕尝试自己解决它。脑洞大开,赶紧用起来吧^_^