映射对象保留键

underscore.js中的map函数(如果使用javascript对象调用)返回从对象的值映射的值的数组。

 _.map({one: 1, two: 2, three: 3}, function(num, key){ return num * 3; }); => [3, 6, 9] 

有没有办法让它保存钥匙? 即,我想要一个返回的函数

 {one: 3, two: 6, three: 9} 

下划线

_.mapObject提供了一个函数_.mapObject来映射值并保存键。

 _.mapObject({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; }); // => { one: 3, two: 6, three: 9 } 

DEMO


Lodash

Lodash提供了一个函数_.mapValues来映射值并保存键。

 _.mapValues({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; }); // => { one: 3, two: 6, three: 9 } 

DEMO

我设法在lodash中find所需的函数,类似于下划线的实用程序库。

http://lodash.com/docs#mapValues

 _.mapValues(object, [callback=identity], [thisArg]) 

使用与对象相同的键创build一个对象,并通过callback运行对象的每个自己的enumerable属性生成值。 callback绑定到thisArg并用三个参数调用; (值,键,对象)。

 var mapped = _.reduce({ one: 1, two: 2, three: 3 }, function(obj, val, key) { obj[key] = val*3; return obj; }, {}); console.log(mapped); 
 <script src="underscore-min.js"></script> <script src="https://getfirebug.com/firebug-lite-debug.js"></script> 

我知道这是旧的,但现在Underscore有一个新的对象的地图:

 _.mapObject(object, iteratee, [context]) 

你当然可以为数组和对象构build一个灵活的地图

 _.fmap = function(arrayOrObject, fn, context){ if(this.isArray(arrayOrObject)) return _.map(arrayOrObject, fn, context); else return _.mapObject(arrayOrObject, fn, context); } 

这个版本在纯JS( ES6 / ES2015 )?

 let newObj = Object.assign(...Object.keys(obj).map(k => ({[k]: obj[k] * 3}))); 

jsbin

如果你想recursion地映射一个对象(映射嵌套的obj),可以这样做:

 const mapObjRecursive = (obj) => { Object.keys(obj).forEach(key => { if (typeof obj[key] === 'object') obj[key] = mapObjRecursive(obj[key]); else obj[key] = obj[key] * 3; }); return obj; }; 

jsbin

由于ES7 / ES2016可以使用Object.entries而不是Object.keys如下所示:

 let newObj = Object.assign(...Object.entries(obj).map([k, v] => ({[k]: v * 3}))); 

_.map返回一个数组,而不是一个对象。

如果你想要一个对象,你最好使用不同的函数,比如each函数; 如果你真的想使用地图,你可以做这样的事情:

 Object.keys(object).map(function(value, index) { object[value] *= 3; }) 

但这是令人困惑的,当看到map时候会期望有一个数组作为结果,然后用它做些什么。

我想你想要一个mapValues函数(将一个函数映射到一个对象的值上),这很容易实现:

 mapValues = function(obj, f) { var k, result, v; result = {}; for (k in obj) { v = obj[k]; result[k] = f(v); } return result; }; 

下划线地图错误的 混合修复 :P

 _.mixin({ mapobj : function( obj, iteratee, context ) { if (obj == null) return []; iteratee = _.iteratee(iteratee, context); var keys = obj.length !== +obj.length && _.keys(obj), length = (keys || obj).length, results = {}, currentKey; for (var index = 0; index < length; index++) { currentKey = keys ? keys[index] : index; results[currentKey] = iteratee(obj[currentKey], currentKey, obj); } if ( _.isObject( obj ) ) { return _.object( results ) ; } return results; } }); 

一个简单的解决方法,保持正确的键和返回对象它仍然使用相同的方式,我可以用这个函数来覆盖bugy _.map函数

或者就像我用它作为一个混合

 _.mapobj ( options , function( val, key, list ) 

你可以使用_.mapValues(users, function(o) { return o.age; }); 在Lodash和_.mapObject({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; }); 在下划线。

看看这里的跨文档: http : //jonathanpchen.com/underdash-api/#mapvalues-object-iteratee-identity