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

Underscore.js: создать карту из списка объектов с помощью ключа, найденного в объекте

Я использую отличную библиотеку Underscore.js. У меня есть конкретная задача, которую я могу сделать хорошо с помощью JavaScript или jQuery, но задавался вопросом, есть ли какая-то абстракция, доступная в Underscore, которую я отсутствовал.

По существу у меня есть такой объект -

var some_object_array = [{id: "a", val: 55}, {id: "b", val: 1}, {id: "c", val: 45}];

Я хочу преобразовать это в

var some_map = {"a": {id: "a", val: 55}, "b": {id: "b", val: 1}, "c": {id: "c", val: 45}};

Я знаю, что могу использовать _.groupBy(some_object_array, "id"). Но это возвращает такую ​​же карту -

var some_grouped_map = {"a": [{id: "a", val: 55}], "b": [{id: "b", val: 1}], "c": [{id: "c", val: 45}]};

Обратите внимание, что это делает то, что рекламируется. Но я надеялся получить some_map без итерации над объектами.

Любая помощь была оценена.

4b9b3361

Ответ 1

Для чего это стоит, так как underscore.js теперь вы можете использовать _.object()

var some_map = _.object(_.map(some_object_array, function(item) {
   return [item.id, item]
}));

Ответ 2

для вашего случая, вы должны использовать функцию indexBy:

var some_object_array = [{id: "a", val: 55}, {id: "b", val: 1}, {id: "c", val: 45}];

var some_grouped_map = _.indexBy(some_object_array, 'id');

Ответ 3

Существует также этот метод

_.reduce(data, function (o, item) { o[item.key] = item.value; return o }, {})

Это один оператор с двумя операторами во внутренней функции.

Ответ 4

Я не думаю, что там что-то ближе, чем groupBy для ваших нужд. Даже если бы это было так, это было бы не лучше простого:

var some_map = {};
_.each(some_object_array, function(val) {
  some_map[val.id] = val;
});

Ответ 5

В этом случае вам не нужно перебирать массив. Не map, не reduce, а не transform. Все, что вам нужно, это старое pluck

_.object(_.pluck(some_object_array, 'id'), some_object_array);

Ответ 6

для ES6, это

var some_map = _.chain(some_object_array)
                .map(item => [item.id, item])
                .object()
                .value()

Ответ 7

Я решил так, используя lodash:

const ar = [
    { key: '1', val: 'a' },
    { key: '2', val: 'b' },
    { key: '3', val: 'c' }
]

const obj = _.keyBy({ ...ar }, 'key')

console.log(obj)
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>