9

オブジェクト/マップ/ハッシュの値を変換するユビキタス/標準のJavascriptまたはCoffeescript関数はありませんか?

jQueryにはあります$.map Arrayが、 sのみを生成します。
アンダースコアはあります_.mapArrayが、 sのみを生成します。

明確にするために、このような関数が私が探しているものです。(この例は、JavascriptではなくCoffeescriptで記述されています。)

# Transforms the values in a map. (Doesn't modify `obj` — returns a new map.)
# Example usage:
#   mapObjVals({ a: 'aa', b: 'bb'}, (key, value) -> value + '_!')
#   --> { a: 'aa_!', b: 'bb_!' }
mapObjVals = (obj, f) ->
  obj2 = {}
  for k, v of obj
    obj2[k] = f k, v
  obj2
4

1 に答える 1

6

オブジェクトをオブジェクトにマップする場合は、コレクションから新しい値を構築するfold(従来の機能用語) または(アンダースコアで使用される一般的な現代名) を使用する必要があります。reduce

  _.reduce(obj, function(newObj, thisValue, thisKey) { 
      // modify newObj based on thisKey/thisValue
      return newObj;
      }, {})

2 番目の引数として渡された関数は、キーと値のペアごとに 1 回呼び出されます。これは、作成中のオブジェクトの最初の引数として渡され、その後に現在の値、関連付けられたキーが続きます。オブジェクトを変更して新しい値を返すのは関数次第です。

の 3 番目の引数_.reduceは、新しいオブジェクトの初期値で、最初のキーと値のペアと共に渡されます。この場合、空の object/map/hash{}です。

Reduce/fold/inject は、値の合計に一般的に使用されます。基本的に、コレクションから新しい単一の値を構築したいときはいつでも。 減らされたとされる値が実際にはオリジナルと同じサイズの別のコレクションであるmapという特殊なケースです。reduce

CoffeeScriptの場合、知る限り、リスト内包表記は、オブジェクトを反復処理する場合でも、常にリストを返します。そのため、 Underscore の CoffeeScript バージョンを調べることをお勧めします。

于 2012-06-11T02:44:45.153 に答える