5

したがって、_.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

4 に答える 4

7

を使用_.object()してオブジェクトに戻すことができます。

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

で直接それを行うには_.map、 map を書き直す必要があります。

于 2013-11-14T23:15:36.343 に答える
7

_.map()は常に配列を返しますが、次の方法で動作を取得できます_.reduce()

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

これは元のオブジェクトを変更して返すことに注意してください。コピーが必要な場合memoは、無名関数の最初の呼び出しで引数として使用される 3 番目の引数として空のオブジェクトを指定できます。

var regurgitateCars = _.reduce(cars, function(memo, value, key) {
    memo[key] = value;
    return memo;
}, {});
于 2013-11-14T23:17:58.227 に答える
1

mapを返すarrayため、独自のオブジェクトを作成せずに元のオブジェクトを返す方法はありません。ドキュメントを参照してください:

変換関数 (反復子) を介してリスト内の各値をマッピングすることにより、値の新しい配列を生成します。ネイティブ マップ メソッドが存在する場合は、代わりにそれが使用されます。リストが JavaScript オブジェクトの場合、反復子の引数は (値、キー、リスト) になります。

于 2013-11-14T23:12:58.923 に答える
1

map の現在の実装でオブジェクトを返す方法はありません。ライブラリがあなたの好きなことをする機能を追加することが提案されています。.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;
});
于 2013-11-14T23:16:15.453 に答える