9

是否没有普遍/标准的 Javascript 或 Coffeescript 函数来转换对象/映射/哈希的值?

jQuery 有$.map ,但它只产生Arrays。
下划线有_.map,但它也只产生Arrays。

需要明确的是,我正在寻找像这样的功能。(这个例子是用 Coffeescript 而不是 Javascript 编写的。)

# 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;
      }, {})

作为第二个参数传递的函数每个键/值对调用一次。它作为第一个参数传入正在构建的对象中,然后是当前值,然后是关联的键。由函数来修改对象并返回其新值。

第三个参数_.reduce是新对象的初始值,与第一个键/值对一起传入;在这种情况下,它是一个空的 object/map/hash {}

减少/折叠/注入通常用于求和值。基本上,任何时候你想从一个集合中构造一个新的单一值。 map实际上只是一个特殊情况,reduce其中据称减少的价值实际上是另一个与原始大小相同的集合。

对于 CoffeeScript、AFAIK,列表推导总是返回列表,即使在迭代对象时也是如此。因此,您可能想查看下划线的 CoffeeScript 版本

于 2012-06-11T02:44:45.153 回答