1

解析されたクエリ文字列オブジェクト、があり、そのオブジェクトに、、、の3つのキーのいずれかreq.queryがあるかどうかを確認したいと思います。foobarbaz

UnderscoreやCoffeeScriptを使用してクエリを実行する慣用的な方法はありますか?

# simple and direct but not very DRY:
if req.query.foo or req.query.bar or req.query.baz
  ..

# using the any filter combined w/ CS's in sugar:
if _(req.query).any (val, key) -> key in ['foo', 'bar', 'baz']
  ..

# plucking just the desired keys:
if _(req.query).pick('foo', 'bar', 'baz').keys().length
  ...

これらのどれよりも優れた別の方法はありますか?いずれにせよ、あなたは何を書きますか?

4

3 に答える 3

4

使ってpickみませんか?

if !_.isEmpty(_(req.query).pick("foo", "bar", "baz"))
  ...
于 2012-12-02T08:33:37.837 に答える
2

どうですか:

queryKeys = _.keys(req.query)
if _(queryKeys).intersection(['foo', 'bar', 'baz']).length
  ...
于 2012-12-02T18:48:41.723 に答える
1

いくつかの選択肢:

# Helper function:
# ----------------
_has = (obj, arr) -> (1 for key in arr when obj.hasOwnProperty(key)).length > 0

if _has req.query, ['foo', 'bar', 'baz']
    ...

# Extending `Object`:
# -------------------
Object::has = (arr) ->
    while arr.length && not result = @hasOwnProperty arr.shift() then
    result

if req.query.has ['foo', 'bar', 'baz']
    ...

# Using native `Array::some`:
# ---------------------------
if ['baz', 'bar', 'foo'].some {}.hasOwnProperty.bind req.query
    # ...

実際に私はこれを書くでしょう:

if (true for key in ['foo', 'bar', 'baz'] when req.query[k]).length

ただし、リストがそれよりも長い場合に限ります。それ以外の場合は、単純if query.foo or query.bar or query.bazさが明確さと効率を優先します。

于 2012-12-04T05:09:59.067 に答える