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

标签 javascript coffeescript

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

jQuery has $.map 但它只生成Array
Underscore has _.map但它也只生成 Array

明确地说,像这样的函数正是我要找的。 (这个例子是用 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

最佳答案

如果要将对象映射到对象,需要使用fold(传统函数式术语)或reduce(现代常用名,下划线使用) ,它从集合中构建一个新值:

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

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

_.reduce 的第三个参数是新对象的初始值,将与第一个键/值对一起传入;在本例中,它是一个空对象/映射/哈希 {}

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

对于 CoffeeScript,AFAIK,列表理解总是返回列表,即使在迭代对象时也是如此。所以你可能想看看 the CoffeeScript version of Underscore .

关于javascript - 任何转换对象*值*的 Javascript 或 Coffeescript `map` 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10974010/

相关文章:

Javascript 切换图像边框在 Firefox 中有效,但在 IE 中无效

javascript - 如何在 ReactJS 上设置 leaflet-PopUp 的宽度和高度?

javascript - Node.js:导出语法错误

coffeescript - Coffeescript 理解和闭包的问题

javascript - 回调范围无法访问 AngularJS 服务中的函数

node.js - 我可以在 Heroku 中运行 CoffeeScript 吗?

backbone.js - 无法让 Backbone.Router 与 coffeescript 一起工作

javascript - 在不适合移动设备的页面上创建适合移动设备的小部件

javascript - 是否可以显示数据库中的博客数据(pdf)和其他结果(字符串)

javascript - 读取一个 json 字符串,其中包含 "'“(格式错误?)