Преобразовать массив объектов в объект пар ключ-значение - PullRequest
1 голос
/ 19 апреля 2020

Это, вероятно, 2 лайнера, но по какой-то причине я врезался в стену.

Я хотел бы преобразовать массив объектов в объект пар ключ-значение.

Так вот:

var items = [
    {
      name: 'hello',
      value: ['one', 'two']
    },
    {
      name: 'hi',
      value: ['one', 'two', 'three']
    }
]

к этому:

var items = {
    'hello': ['one', 'two'],
    'hi': ['one', 'two', 'three']
}

Это действительно самый элегантный способ?

const newObj = {};
items.forEach((item) => {
  newObj[item.name] = item.value;
});

Я бы хотел использовать функции стрелок ES6. Кроме того, кто-то может сказать мне, если вы думаете, что было бы легче манипулировать этими данными в первом или втором формате? Для контекста я пытаюсь научить себя топологическим видам.

Ответы [ 5 ]

5 голосов
/ 19 апреля 2020

Более кратким методом будет использование Object.fromEntries:

var items = [
    {
      name: 'hello',
      value: ['one', 'two']
    },
    {
      name: 'hi',
      value: ['one', 'two', 'three']
    }
];
const newObj = Object.fromEntries(
  items.map(({ name, value }) => [name, value])
);
console.log(newObj);
2 голосов
/ 19 апреля 2020

Я бы сделал это с Array.prototype.reduce(), это еще более кратко и, конечно, быстрее , чем Object.fromEntries():

const items = [{name:'hello',value:['one','two']},{name:'hi',value:['one','two','three']}], 

result = items.reduce((r,{name,value}) => (r[name]=value,r), {})

console.log(result)
.as-console-wrapper{min-height:100%;}
0 голосов
/ 19 апреля 2020

Используйте Object.values и Object.fromEntries для упрощения в одну строку

Object.fromEntries(items.map(item => Object.values(item)))

var items = [
  {
    name: "hello",
    value: ["one", "two"]
  },
  {
    name: "hi",
    value: ["one", "two", "three"]
  }
];

const res = Object.fromEntries(items.map(item => Object.values(item)));

console.log(res);
0 голосов
/ 19 апреля 2020

Просто сопоставляя элементы каждого массива:

используйте метод map ():

const newObj = {};
items.map( ( { name, value } ) => {
    newObj[name] = value;
});

РЕДАКТИРОВАТЬ:

используйте метод forEach () :

const newObj =
((obj) => {
    items.forEach(({ name, value }) => { obj [name] = value });
    return obj;
 })({});

JavaScript: разница между .forEach () и .map ()

0 голосов
/ 19 апреля 2020

Я не знаю, более ли это элегантно , но я думаю reduce имеет смысл здесь.

var items = [
    {
      name: 'hello',
      value: ['one', 'two']
    },
    {
      name: 'hi',
      value: ['one', 'two', 'three']
    }
];


const newObj = items.reduce((c, {value, name}) => {
  c[name] = value;
  return c;
}, {});

console.log(newObj);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...