map
underscore.js中的函数(如果与javascript对象一起调用)将返回从该对象的值映射的值的数组。
_.map({one: 1, two: 2, three: 3}, function(num, key){ return num * 3; });
=> [3, 6, 9]
有没有办法使它保留密钥?即,我想要一个返回的函数
{one: 3, two: 6, three: 9}
map
underscore.js中的函数(如果与javascript对象一起调用)将返回从该对象的值映射的值的数组。
_.map({one: 1, two: 2, three: 3}, function(num, key){ return num * 3; });
=> [3, 6, 9]
有没有办法使它保留密钥?即,我想要一个返回的函数
{one: 3, two: 6, three: 9}
Answers:
带下划线
下划线提供了_.mapObject
映射值和保留键的功能。
_.mapObject({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; });
// => { one: 3, two: 6, three: 9 }
与洛达什
Lodash提供了_.mapValues
映射值和保留键的功能。
_.mapValues({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; });
// => { one: 3, two: 6, three: 9 }
_.map()
returning [['one', 3], ['two', 6], ['three', 9]]
,它是一个数组数组,并将_.object()
其变成对象。
我设法在lodash(类似于下划线的实用程序库)中找到了所需的功能。
http://lodash.com/docs#mapValues
_.mapValues(object, [callback=identity], [thisArg])
创建一个与对象具有相同键的对象,并通过在回调中运行对象的每个可枚举属性来生成值。回调绑定到thisArg,并使用三个参数调用;(值,键,对象)。
我知道这很旧,但是现在Underscore有了一个新的对象映射:
_.mapObject(object, iteratee, [context])
您当然可以为数组和对象构建一个灵活的映射
_.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})));
如果要递归地映射对象(映射嵌套的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;
};
由于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
一个人期望将数组作为结果然后用它做点什么时。
map
用于改变产生阵列作为输出的输入,则可以构成_.object
和_.map
作为@GG。写道,但是这只是一个品味问题。
const mapObject = (obj = {}, mapper) =>
Object.entries(obj).reduce(
(acc, [key, val]) => ({ ...acc, [key]: mapper(val) }),
{},
);
下划线地图错误的混合修复: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;
}
});
一个简单的解决方法,可以保持正确的键并作为对象返回它仍然以与我的访客相同的方式使用,您可以使用此函数来覆盖错误的_.map函数
或仅仅是因为我将其用作混音
_.mapobj ( options , function( val, key, list )
您可以_.mapValues(users, function(o) { return o.age; });
在Lodash和Underscore _.mapObject({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; });
中使用。
在此处查看交叉文档:http : //jonathanpchen.com/underdash-api/#mapvalues-object-iteratee-identity