Есть ли простой/чистый способ использования Underscore, чтобы включить этот
[ { id: 'medium', votes: 7 },
{ id: 'low', votes: 9 },
{ id: 'high', votes: 5 } ]
В
{ 'low' : 9,
'medium' : 7,
'high' : 5 }
Есть ли простой/чистый способ использования Underscore, чтобы включить этот
[ { id: 'medium', votes: 7 },
{ id: 'low', votes: 9 },
{ id: 'high', votes: 5 } ]
В
{ 'low' : 9,
'medium' : 7,
'high' : 5 }
var data = [ { id: 'medium', votes: 7 },
{ id: 'low', votes: 9 },
{ id: 'high', votes: 5 } ];
Вы можете сделать это с помощью _.map
, _.values
и _.object
, вроде этого
console.log(_.object(_.map(data, _.values)));
# { medium: 7, low: 9, high: 5 }
Объяснение
Мы используем функцию map
для применения функции values
(которая получает все значения данного объекта) по всем элементам data
, что даст
# [ [ 'medium', 7 ], [ 'low', 9 ], [ 'high', 5 ] ]
Затем мы используем функцию object
, чтобы преобразовать ее в объект.
Вы можете рассмотреть _.indexBy(...)
var data = [{
id: 1,
name: 'Jon Doe',
birthdate: '1/1/1991',
height: '5 11'
}, {
id: 2,
name: 'Jane Smith',
birthdate: '1/1/1981',
height: '5 6'
}, {
id: 3,
name: 'Rockin Joe',
birthdate: '4/4/1994',
height: '6 1'
}, {
id: 4,
name: 'Jane Blane',
birthdate: '1/1/1971',
height: '5 9'
}, ];
var transformed = _.indexBy(data, 'id');
Вот скрипка: https://jsfiddle.net/4vyLtcrf/3/
Обновление: В Lodash 4.0.1 метод _.indexBy был переименован в _.keyBy
Вот с ванилью js:
var result = {};
[ { id: 'medium', votes: 7 },
{ id: 'low', votes: 9 },
{ id: 'high', votes: 5 } ].forEach(function(obj) {
result[obj.id] = obj.votes;
});
console.log(result);
проще со мной: each
:
var t = {};
_.each(x, function(e){
t[e.id] = e.votes;
});
//--> {medium: 7, low: 9, high: 5}
Самый мощный метод подчеркивания уменьшается. Вы можете делать с ним что угодно. И большая выгода заключается в том, что вы перебираете коллекцию только ONCE!
var array = [
{ id: 'medium', votes: 7 },
{ id: 'low', votes: 9 },
{ id: 'high', votes: 5 }
];
var object = _.reduce(array, function(_object, item) {
_object[item.id] = item.votes;
return _object;
}, {});
После запуска объект будет:
{
medium:7,
low:9,
high:5
}
Использовать indexBy
_.indexBy([
{ id: 'medium', votes: 7 },
{ id: 'low', votes: 9 },
{ id: 'high', votes: 5 }
], 'id');
Я знаю, что это старый пост, но вы можете использовать _.reduce
для преобразования в чистом виде.
var data = [
{ id: 'medium', votes: 7 },
{ id: 'low', votes: 9 },
{ id: 'high', votes: 5 }
]
var output = _.reduce(data, function(memo, entry) {
memo[entry.id] = entry.votes;
return memo;
}, {});
console.log(output);