Подтвердить что ты не робот

Эквивалент _.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)
        })
    }

});

Я не уверен, есть ли какая-то собственная функция, которую я пропускаю.

Я нашел аналогичный вопрос здесь, но я ищу более подходящий путь.

4b9b3361

Ответ 1

Я думаю, что ваш лучший выбор - map() + pick(). Вы могли бы создать обратный вызов вместо создания встроенной функции:

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

Ответ 2

В моем случае мне также нужен тип для наложения, и проблема заключалась в том, что TS-компилятор представляет решение Адама Бодуха, возвращающее логическое значение, поэтому я нахожу немного простой способ сделать это:

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

В этом случае вы также можете добавить некоторые новые свойства.

P.S. Поскольку я не могу оставить комментарий, я добавлю объяснение об использовании partialRight здесь:

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

Сначала, если вызов u вызывает _.map(array, func) func будет вызываться для каждого элемента массива. Таким образом, он равен: _.map(array, item => func(item)).

Второй результат вызова partialRight будет функцией newFunc, поэтому мы можем представить код Adam как:

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

Третий мы можем представить логику newFunc следующим образом:

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

Наконец Я думаю, что наиболее понятное и понятное решение для этой проблемы:

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

Ответ 3

Я нашел более простое решение в примеры карт:

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

Ответ 4

Если вам нужен только один из ключей, которые вы можете сделать:

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