任何转换对象*值*的Javascript或Coffeescript`map`函数?

Kaj*_*nus 9 javascript coffeescript

是否没有普遍存在的/标准的Javascript或Coffeescript函数来转换对象/ map/hash的值?

jQuery$.map 但只生成了Arrays.
Underscore有,_.map但它也Array只生产s.

要清楚,我正在寻找像这样的功能.(这个例子是用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
Run Code Online (Sandbox Code Playgroud)

Mar*_*eed 6

如果要将对象映射到对象,则需要使用fold(传统的功能术语)或reduce(通用现代名称,由下划线使用),它从集合中构建新值:

  _.reduce(obj, function(newObj, thisValue, thisKey) { 
      // modify newObj based on thisKey/thisValue
      return newObj;
      }, {})
Run Code Online (Sandbox Code Playgroud)

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

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

减少/折叠/注入通常用于求和值.基本上,只要您想从集合构造新的单个值. map实际上只是一个特殊情况,reduce据称减少的价值实际上是另一个与原始尺寸相同的集合.

对于CoffeeScript,AFAIK,列表推导总是返回列表,即使在迭代对象时也是如此.所以你可能想看看下划线的CoffeeScript版本.