144

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}
4

12 に答える 12

245

アンダースコア付き

アンダースコアは、_.mapObject値をマップしてキーを保持する機能を提供します。

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

// => { one: 3, two: 6, three: 9 }

DEMO


ロダッシュ

Lodash は、_.mapValues値をマップしてキーを保持する機能を提供します。

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

// => { one: 3, two: 6, three: 9 }

DEMO

于 2013-09-26T08:43:45.403 に答える
57

アンダースコアに似たユーティリティライブラリであるlodashで必要な関数を見つけることができました。

http://lodash.com/docs#mapValues

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

オブジェクトと同じキーと、コールバックを介してオブジェクトの列挙可能な各プロパティを実行することによって生成された値を持つオブジェクトを作成します。コールバックは thisArg にバインドされ、3 つの引数で呼び出されます。(値、キー、オブジェクト)。

于 2014-07-01T02:34:49.937 に答える
19

var mapped = _.reduce({ one: 1, two: 2, three: 3 }, function(obj, val, key) {
    obj[key] = val*3;
    return obj;
}, {});

console.log(mapped);
<script src="http://underscorejs.org/underscore-min.js"></script>
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

于 2014-08-27T11:43:52.223 に答える
15

プレーンJS( ES6 / ES2015)のこのバージョンはどうですか?

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

jsbin

オブジェクトを再帰的にマップする(ネストされた 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})));

そしてES2019以降、使用できます Object.fromEntries

let newObj = Object.fromEntries(Object.entries(obj).map(([k, v]) => ([k, v * 3])))
于 2016-08-08T11:53:15.080 に答える
13

これが古いことは知っていますが、現在、アンダースコアにはオブジェクトの新しいマップがあります:

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

もちろん、配列とオブジェクトの両方に対して柔軟なマップを構築できます

_.fmap = function(arrayOrObject, fn, context){
    if(this.isArray(arrayOrObject))
      return _.map(arrayOrObject, fn, context);
    else
      return _.mapObject(arrayOrObject, fn, context);
}
于 2015-04-24T13:11:19.463 に答える
5

私はそれが長い間あったことを知っていますが、フォールド(別名jsのreduce)による最も明白な解決策がまだありません。完全を期すために、ここに残します:

function mapO(f, o) {
  return Object.keys(o).reduce((acc, key) => {
    acc[key] = f(o[key])
    return acc
  }, {})
}
于 2018-02-28T11:01:56.873 に答える
3

mapValues関数 (オブジェクトの値に関数をマップするため)が必要だと思います。これは、自分で実装するのに十分簡単です。

mapValues = function(obj, f) {
  var k, result, v;
  result = {};
  for (k in obj) {
    v = obj[k];
    result[k] = f(v);
  }
  return result;
};
于 2014-03-28T02:58:07.490 に答える
3

_.mapは、オブジェクトではなく配列を返します。

オブジェクトが必要な場合は、次のような別の関数を使用することをお勧めしますeach。本当にマップを使用したい場合は、次のようにすることができます。

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

mapしかし、結果として配列があり、それを使用して何かを作成することが期待される場合、それは混乱を招きます。

于 2013-09-26T08:36:29.157 に答える
0

_.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

于 2016-12-31T01:44:02.210 に答える