web-dev-qa-db-ja.com

_.pick()と同等ですが、Lo-dashの配列用

次のコレクションがあります。

var columns = [
    { key:'url', width:20, type:'text' },
    { key:'title', width:21, type:'text' },
    { key:'desc', width:22, type:'text' },
    { key:'domain', width:23, type:'text' },
    { key:'user', width:24, type:'text' }
];

私は、選択されたキーを持つオブジェクトの配列をマップする方法を探しています。

_.mapPick(columns, [width]) 
// [{width:20},{width:21},{width:22},{width:23},{width:24}]

このようにlo-dashを拡張できることを知っています。

_.mixin({
    mapPick:  mapPick:function (objs,keys){
        return _.map(objs, function (obj) {
            return _.pick(obj,keys)
        })
    }

});

欠けているネイティブ関数があるかどうかはわかりません。

同様の質問を見つけました here ですが、もっとローダッシュのネイティブな方法を探しています。

31
pery mimon

map() + pick() アプローチが最善の策だと思います。ただし、インライン関数を作成する代わりにコールバックを作成できます。

_.map(columns, _.partialRight(_.pick, 'key'));
24
Adam Boduch

私の場合、型へのキャストも必要です。問題は、TSコンパイラがAdam Boduchソリューションがブール値を返すことを表しているため、これを行う簡単な方法を見つけることです。

__.map(columns, item => { return { key: item.key } });
_

この場合、いくつかの新しいプロパティを追加することもできます。

追伸コメントを投稿できないので、ここにpartialRightの使用法に関する説明を追加します。

__.map(columns, _.partialRight(_.pick, 'key'));
_

最初 uを呼び出す場合_.map(array, func)funcはすべての配列要素に対して呼び出されます。したがって、等しい:_.map(array, item => func(item))

Second呼び出しの結果partialRightは関数newFunc、したがって、Adamのコードを次のように表すことができます。

_var newFunc = _.partialRight(_.pick, 'key');
_.map(array, item => newFunc(item));
_

ThirdnewFuncロジックを次のように表すことができます:

_function newFunc(item) {
    return _.pick(item, 'key')
}
_

最後にこの問題の最も理解しやすく、読みやすい解決策は次のとおりです。

__.map(columns, item => _.pick(item, 'key'))
_
19
Vlad

map examples でより簡単な解決策を見つけました。

var users = [
    {name:'David',age:35},
    {name:'Kate',age:28},
];
_.map(users,'age'); // [35,28]
14
David

あなたができるキーの1つだけが必要な場合:

_.map(collection, 'key')

あなたの例:

var columns = [
    { key:'url', width:20, type:'text' },
    { key:'title', width:21, type:'text' },
    { key:'desc', width:22, type:'text' },
    { key:'domain', width:23, type:'text' },
    { key:'user', width:24, type:'text' }
];

var widths = _.map(columns, 'width');

widths
[20, 21, 22, 23, 24]
5
Metalstorm

ES6 destructuring および arrow functions を使用すると、次のようにできます。

columns.map(({width}) => ({width}))

ロダッシュは必要ありません。

4
Dr Hund