是否没有无处不在/标准的Javascript或Coffeescript函数来转换对象/ map / hash的值?
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
答案 0 :(得分:6)
如果要将对象映射到对象,则需要使用fold
(传统功能术语)或reduce
(通用现代名称,由下划线使用),这将构建新值来自一个集合:
_.reduce(obj, function(newObj, thisValue, thisKey) {
// modify newObj based on thisKey/thisValue
return newObj;
}, {})
每个键/值对调用一次作为第二个参数传递的函数。它在作为第一个参数构建的对象中传递,后跟当前值,后跟关联的键。由函数来修改对象并返回其新值。
_.reduce
的第三个参数是新对象的初始值,用第一个键/值对传入;在这种情况下,它是一个空对象/ map / hash {}
。
Reduce / fold / inject通常用于求和值。基本上,只要您想从集合构造新的单个值。 map
实际上只是reduce
的一个特例,其中涉嫌减少的价值实际上是另一个与原始尺寸相同的集合。
对于CoffeeScript,AFAIK,列表推导总是返回列表,即使在迭代对象时也是如此。所以你可能想看看the CoffeeScript version of Underscore。