【问题标题】:How to filter out specific keys from object using Ramda?如何使用 Ramda 从对象中过滤掉特定的键?
【发布时间】:2017-09-06 00:57:29
【问题描述】:

http://ramdajs.com/0.21.0/docs/#prop

Ramda Repl

var myObject = {a: 1, b: 2, c: 3, d: 4};

var newObject = R.filter(R.props('a'), myObject);
//var newObject = R.filter(R.equals(R.props('a')), myObject);

console.log('newObject', newObject);

现在上面的代码正在返回整个对象:

newObject {"a":1,"b":2,"c":3,"d":4}

我想做的只是用'a' 键返回一个新对象。或者带有 a 和 b 键的新对象。

【问题讨论】:

  • 你想用你想要的键返回一个对象吗?

标签: javascript object functional-programming ramda.js


【解决方案1】:

pickBy()

const getOnlyGoods = R.pickBy((_, key) => key.includes('good'));

const onlyGoods = getOnlyGoods({
  "very good":    90,
  "good":         80,
  "good enough":  60,
  "average":      50,
  "bad":          30,
  "?":           10,
});

console.log(onlyGoods);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>

【讨论】:

    【解决方案2】:

    Jared Smith 的回答很棒。我只是想添加一个注释,说明您的代码为什么不起作用。你试过了

    R.filter(R.props('a'), {a: 1, b: 2, c: 3, d: 4});
    

    首先,您指向prop 的文档,但使用了props。这些是不同但相关的功能。 prop 看起来像

    // prop :: k -> {k: v} -> v
    prop('c', {a: 1, b: 2, c: 3, d: 4}); //=> 3
    

    (undefined 会增加一些复杂性。)

    另一方面,props 接受多个值

    // props :: [k] -> {k: v} -> [v]
    props(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> [1, 4]
    

    但是对于filter,这些都不是有用的输入,出于这些目的,我们可以将其视为

    // filter :: (k -> Bool) -> {k: v} -> {k: v}
    

    filter 的第一个参数是一个从(字符串)键到布尔值的函数;它符合 Javascript 的理念,即除了一些特定的值之外,一切都是真实的。它将被每个键依次调用。因此,例如,在决定是否包含{c: 3} 时,它调用props('a')('c'),由于另一个有点奇怪的原因*,它实际上有效,返回[3],它被视为真值,并且过滤器函数将在其输出中包含{c: 3}。因此,每个键也将包括在内。


    *props('a', obj) 真正应该是 props(['a'], obj) 的原因是,在 JS 中,字符串与列表足够接近,具有 length 属性和索引值。 'a'.length; ==> 1,'a'[0]; //=> 'a'。因此props 可以将单字符串视为字符串的单元素列表。但这也可能有点奇怪:R.props('cabby', {a: 1, b: 2, c: 3, d: 4}); //=> [3, 1, 2, 2, undefined]。

    【讨论】:

      【解决方案3】:

      使用pick:

      let newObj = R.pick(['a'], oldObj);
      

      如果您的过滤条件比存在更复杂,您可以使用pickBy 通过任意谓词函数进行选择。

      【讨论】:

        猜你喜欢
        • 2017-11-10
        • 1970-01-01
        • 2018-01-28
        • 1970-01-01
        • 1970-01-01
        • 2020-06-28
        • 1970-01-01
        • 2015-10-20
        • 2022-11-17
        相关资源
        最近更新 更多