是否没有普遍存在的/标准的 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/