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}
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({ 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 }
アンダースコアに似たユーティリティライブラリであるlodashで必要な関数を見つけることができました。
http://lodash.com/docs#mapValues
_.mapValues(object, [callback=identity], [thisArg])
オブジェクトと同じキーと、コールバックを介してオブジェクトの列挙可能な各プロパティを実行することによって生成された値を持つオブジェクトを作成します。コールバックは thisArg にバインドされ、3 つの引数で呼び出されます。(値、キー、オブジェクト)。
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>
プレーン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})));
そしてES2019以降、使用できます Object.fromEntries
。
let newObj = Object.fromEntries(Object.entries(obj).map(([k, v]) => ([k, v * 3])))
これが古いことは知っていますが、現在、アンダースコアにはオブジェクトの新しいマップがあります:
_.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のreduce)による最も明白な解決策がまだありません。完全を期すために、ここに残します:
function mapO(f, o) {
return Object.keys(o).reduce((acc, key) => {
acc[key] = f(o[key])
return acc
}, {})
}
mapValues関数 (オブジェクトの値に関数をマップするため)が必要だと思います。これは、自分で実装するのに十分簡単です。
mapValues = function(obj, f) {
var k, result, v;
result = {};
for (k in obj) {
v = obj[k];
result[k] = f(v);
}
return result;
};
_.mapは、オブジェクトではなく配列を返します。
オブジェクトが必要な場合は、次のような別の関数を使用することをお勧めしますeach
。本当にマップを使用したい場合は、次のようにすることができます。
Object.keys(object).map(function(value, index) {
object[value] *= 3;
})
map
しかし、結果として配列があり、それを使用して何かを作成することが期待される場合、それは混乱を招きます。
_.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