没有无处不在/标准的Javascript或Coffeescript函数来转换对象/映射/哈希的值吗?
jQuery有$.map
,但它只产生Array
。
下划线具有_.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
的第三个参数是新对象的初始值,与第一个键/值对一起传入;在这种情况下,它是一个空对象/映射/哈希{}
。
减少/折叠/注入通常用于对值求和。 基本上,任何时候你都想从集合中构造一个新的单值。 map
实际上只是reduce
的一个特例,据称降低的价值实际上是另一个与原始大小相同的集合。
对于 CoffeeScript、AFAIK,列表推导式总是返回列表,即使在迭代对象时也是如此。因此,您可能需要查看Underscore的CoffeeScript版本。