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 に答える