0

与 ruby​​ 的 Hash#reject/delete_if 方法最接近的等价物是什么?

{a:1, b:2, c:3, d:4}.reject { |k,v| v > 2 }
=> {:a=>1, :b=>2}

这个快速版本使用key, value of <Object>但它并不优雅,并且缺乏传递任意条件的能力(作为一个块或其他)

params = {a:1, b:2, c:3}
filter = (hash)->
    result = {}
    (result[key] = value unless value > 2) for key, value of params
    result

console.log(filter(params))

underscore 有类似的_.omit方法,但只适用于键。

4

1 回答 1

2

不幸的是,CoffeeScript 推导总是生成数组。您可以使用 Underscore 的object方法将[key, value]数组转换为对象:

obj = {a:1, b:2, c:3, d:4}
_.object([k, v] for k, v of obj when v <= 2) # -> {a:1, b:2}

我建议您为此特定目的编写自己的方法:

reject = (obj, predicate) ->
  res = {}
  res[k] = v for k, v of obj when not predicate k, v
  res

reject {a:1, b:2, c:3, d:4}, (k, v) -> v > 2 # -> {a:1, b:2}
于 2012-10-09T19:06:15.577 回答