преобразовать массив объектов в объект на основе заданного ключа - PullRequest
1 голос
/ 30 марта 2019

Я новичок в Javascript.

Мне нужно написать функцию для преобразования массива объектов в объект с заданным ключом.

Ввод такой, как этот

convert([{id: 1, value: 'abc'}, {id: 2, value: 'xyz'}], 'id')

и вывод должен быть таким

{
    '1': {id: 1, value: 'abc'},
    '2': {id: 2, value: 'xyz'}
}

Я попробовал приведенный ниже код.

Когда я пытаюсь сделать это прямо в консоли, кажется, что это работает.

var arr = [{ id: 1, name: 'John', role: 'Developer'},
	   { id: 2, name: 'Jane', role: 'Lead'},
	   { id: 3, name: 'Robbie', role: 'QA'}];

let res = arr.reduce((prev, current) => {
  prev[current.v] = current;
  return prev;
}, {})

console.log(res)

Но, когда я пытаюсь сделать это из функции, она не работает.

function f(k, v) {
  //console.log(k);              
  k.reduce((prev, current) => {
    prev[current.v] = current;
    return prev;
    console.log(prev)
  }, {})
}

f(arr, 'role');

Любая помощь будет высоко оценена.

Ответы [ 6 ]

2 голосов
/ 30 марта 2019

Вы можете использовать функциональный подход, сопоставляя назначаемый новый объект.

function convert(array, key) {
    return Object.assign(...array.map(o => ({ [o[key]]: o })));
}


console.log(convert([{ id: 1, value: 'abc' }, { id: 2, value: 'xyz' }], 'id'))
1 голос
/ 30 марта 2019

Это решение работает для меня:

function convert(obj, key) {
    var newObj = {};
    obj.forEach(element => {
        newObj[element[key]] = element;
    });
    return newObj;
}

var newObj = convert([{id: 1, value: 'abc'}, {id: 2, value: 'xyz'}], 'id');

console.log(newObj);
0 голосов
/ 30 марта 2019

Вы можете использовать reduce и spread следующим образом:

var arr = [{id: 1, value: 'abc'}, {id: 2, value: 'xyz'}];

const res = arr.reduce((total, curr) => {
  return {...total, [curr.id]: curr };
}, {});

console.log(res);

рефов: 1011 * снизить * Синтаксис распространения

0 голосов
/ 30 марта 2019

Ваш код в значительной степени работает, единственными ошибками является использование скобочной нотации для доступа к ключу переменной;например:

obj[v] будет оцениваться в obj.id, если v было id

Другая ошибка заключается в том, что вы просто пропускаете return из своей функции, в результате чегов undefined результате

var arr = [{ id: 1, name: 'John', role: 'Developer'},
	   { id: 2, name: 'Jane', role: 'Lead'},
	   { id: 3, name: 'Robbie', role: 'QA'}];


function f(k, v) {
  //console.log(k);              
  return k.reduce((prev, current) => {
    prev[current[v]] = current;
    return prev;
  }, {})
}

console.log(f(arr, 'role'));

Также обратите внимание, что после return ничего не произойдет, поэтому строка console.log в вашем редукторе должна быть до этого, в противном случае она игнорируется.

0 голосов
/ 30 марта 2019

Это просто. Почему усложняют путем уменьшения и т. Д.,

function convert(arr, key) {
  output = {};
  arr.forEach(function(item) {
    output[item[key]] = item;
  })
  console.log(output)
  return output
}

convert([{id: 1, value: 'abc'}, {id: 2, value: 'xyz'}], 'id')

https://jsfiddle.net/cvydtL7p/

0 голосов
/ 30 марта 2019

Вы близки, но вам нужно обозначение вложенных скобок, чтобы получить правильное имя ключа, например,

prev[current[v]]

или

a[item[keyName]] // as in code below

const convert = (arr, keyName) => arr.reduce((a, item) => {
  a[item[keyName]] = item;
  return a;
}, {});

console.log(
  convert([{id: 1, value: 'abc'}, {id: 2, value: 'xyz'}], 'id')
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...