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}
回答:
アンダースコア
アンダースコアは_.mapObject
、値をマップしてキーを保持する機能を提供します。
_.mapObject({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; });
// => { one: 3, two: 6, three: 9 }
Lodash
Lodashは_.mapValues
、値をマップし、キーを保持する機能を提供します。
_.mapValues({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; });
// => { one: 3, two: 6, three: 9 }
_.map()
は[['one', 3], ['two', 6], ['three', 9]]
配列の配列であるを返し、それを_.object()
オブジェクトに戻しています。
アンダースコアに似たユーティリティライブラリであるlodashで必要な関数を見つけることができました。
http://lodash.com/docs#mapValues
_.mapValues(object, [callback=identity], [thisArg])
オブジェクトと同じキーを持つオブジェクトと、コールバックを通じてオブジェクトのそれぞれの列挙可能なプロパティを実行することにより生成される値を持つオブジェクトを作成します。コールバックはthisArgにバインドされ、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);
}
mapObject
。mapValues
代わりにlodashのメソッドを見てください。
プレーンJS(ES6 / ES2015)のこのバージョンはどうですか?
let newObj = Object.assign(...Object.keys(obj).map(k => ({[k]: obj[k] * 3})));
オブジェクトを再帰的にマップする(ネストされたオブジェクトをマップする)場合は、次のように実行できます。
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})));
_。地図はオブジェクトではなく配列を返します。
オブジェクトが必要な場合は、次のような別の関数を使用したほうがよいでしょう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と_.mapObject({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; });
Underscoreで使用できます。
こちらのクロスドキュメントを確認してください:http : //jonathanpchen.com/underdash-api/#mapvalues-object-iteratee-identity