【问题标题】:Filter by (unique) matching values按(唯一)匹配值过滤
【发布时间】:2016-06-04 04:04:11
【问题描述】:

与 Ramda 和

const data = [{
  "id": "a",
  "name": "A"
}, {
  "id": "b",
  "name": "B"
}, {
  "id": "c",
  "name": "C"
}]

我可以的

const findById = (id, data) => R.pipe(
  R.find(R.propEq('id', id))
)(data)

const id = "a"

findById(id, data) // => { "id": "a", "name": "A" }

但是如果使用一个 id 值数组来返回一个仅包含匹配对象的列表呢?即

const ids = ["a", "c"]

const findByIds = (ids, data) => R.pipe(
  // ?
)(data)

findByIds(ids, data) // => [{"id": "a", "name": "A"}, {"id": "c", "name": "C"}]

类似于 pluck、pick 等,但对于值而不是键,每个值都可以被假定为唯一的。

(更喜欢简洁,甚至可能是无点变体)。

到目前为止,我最接近的是交换 ?对于任何一个

  R.filter(x => R.contains(x.id, ids))

或

  R.takeWhile(x => R.contains(x.id, ids))

两者都产生 A 对象。

谢谢!我对 Ramda 很陌生,以上主要是我使用它的方式,所以任何关于这方面的见解也非常受欢迎。

更新

这是一个非问题。它实际上适用于REPL,但不适用于我本地环境(Atom + Wallaby + AVA)中的测试。不知道为什么,但如果我弄清楚了,我会更新。查看使用静态和动态密钥的变体的已验证答案。听到任何其他方法仍然会很有趣。

更新 2

原来这只是一个错字。也许我应该重新考虑使用复杂的哈希作为测试 ID。 :D

【问题讨论】:

    标签: javascript functional-programming ramda.js


    【解决方案1】:

    (更喜欢简洁,甚至可能是无点变体)。

    这是错误的目标。更喜欢阅读良好且有效的代码。编码不是最短答案获胜的游戏,除非coding is a game where the shortest answer wins。如果你想要“打高尔夫球”的代码,你应该在那里问。

    不管怎样,你自己已经给出了答案。

    var data = [{
      "id": "a",
      "name": "A"
    }, {
      "id": "b",
      "name": "B"
    }, {
      "id": "c",
      "name": "C"
    }];
    
    const findByIds = R.curry((ids, data)=>
      R.filter(x=> R.contains(x.id, ids), data));
    
    findByIds (['a', 'c']) (data);
    //=> [{"id": "a", "name": "A"}, {"id": "c", "name": "C"}]
    

    也许您希望 "id" 成为动态属性

    var data = [{
      "id": "a",
      "name": "A"
    }, {
      "id": "b",
      "name": "B"
    }, {
      "id": "c",
      "name": "C"
    }];
    
    const findByProp = R.curry((prop, ids, data) =>
      R.filter(x=> R.contains(x[prop], ids), data));
    
    findByProp ('id', ['a', 'c'], data);
    //=> [{"id": "a", "name": "A"}, {"id": "c", "name": "C"}]
    

    【讨论】:

    • 您的环境是否支持 ES6 箭头功能?
    • 我也会在数据参数中柯里化:const findByProp = curry((prop, ids, data) => R.filter(x => R.contains(x[prop], ids), data));
    • 只是灵活性。然后,您可以将其称为 findByProp('id', ids, data) 或 findByProp('id')(id, data) 或 findByProp('id', ids)(data) 或 findByProp('id')(ids)(data),因为事实证明这是最方便的。
    • 关注可读性!当它增加可读性时,无点非常棒,因为它有时可以。但它本身不应该成为一个目标。
    • @ScottSauyet 啊,我只是想 Rambda 的神奇咖喱酱可以弥补差距。我个人用手动咖喱编写所有内容,所以我习惯于编写/链接我的表达式,而不必考虑arity。感谢分享这个 Rambda 成语。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2021-09-08
    相关资源
    最近更新 更多