从_.map()返回对象

时间:2013-11-14 23:04:05

标签: javascript arrays object map underscore.js

因此下划线中的_.map()函数不会返回一个对象,但它需要它们。它有什么办法可以返回完全相同的对象吗?

var _ = require("underscore");

var cars = {
    "mom": {
        "miles": "6",
        "gas": "4"
    },
    "dad": {
        "miles": "6",
        "gas": "4"
    }
}

var regurgitate_cars = _.map(cars, function(value, key){
    return value;
});

/*
[ { miles: '6', gas: '4' }, { miles: '6', gas: '4' } ]
*/

var regurgitate_cars = _.map(cars, function(value, key){
    var transfer = {};
    transfer[key] = value;
    return transfer;
});

/*
[ { mom: { miles: '6', gas: '4' } },
  { dad: { miles: '6', gas: '4' } } ]
*/

4 个答案:

答案 0 :(得分:7)

您可以使用_.object()将其重新转换为对象。

var regurgitate_cars = _.object(
    _.map(cars, function(value, key){
        return [key, value];
    })
);

至于直接使用_.map执行此操作,您必须重写地图才能执行此操作。

答案 1 :(得分:7)

_.map()将始终返回一个数组,但您可以使用_.reduce()获取行为:

var regurgitateCars = _.reduce(cars, function(memo, value, key) {
    memo[key] = value;
    return memo;
}, cars);

注意,这将修改并返回原始对象,如果你想要一个副本,你可以提供一个空对象作为第三个参数,它将在第一次调用匿名函数时用作memo参数:

var regurgitateCars = _.reduce(cars, function(memo, value, key) {
    memo[key] = value;
    return memo;
}, {});

答案 2 :(得分:1)

map会返回一个array,所以你无法通过编写自己的对象来返回原始对象。见documentation

  

通过映射列表中的每个值来生成新的值数组   转换函数(迭代器)。如果存在本机地图方法,   它将被替代使用。如果list是JavaScript对象,那么迭代器就是   参数将是(值,键,列表)。

答案 3 :(得分:0)

无法使用当前的map实现返回对象。 It's been suggested该库添加了.mapValues()函数,可以执行您喜欢的操作。以下是将其添加到代码中的方法:

_.mixin({
    mapValues: function (input, mapper) {
        return _.reduce(input, function (obj, v, k) {
            obj[k] = mapper(v, k, input);
        }, {});
    }
});

现在您可以使用mapValues返回一个新对象:

var regurgitate_cars = _.mapValues(cars, function(value, key){
    return value;
});