Спред для объекта в React - PullRequest
       11

Спред для объекта в React

1 голос
/ 06 февраля 2020

У меня есть массив объектов, и я хочу, чтобы он стал объектом, который go { 44: "autoTest", 94: "autoTest", ...}

[
  0: {
    id: 1, 
    name: "test", 
    description: "a description"
  }, 
  1: {
    id: 2, 
    name: "test 2", 
    description: "a description french baguette"
  }
]

станет

{
  1: "test", 
  2: "test2"
}

Мой код до сих пор с некоторые console.log ():

const { options } = this.state;
console.log(options); // […] 0: Object { id: 44, name: "autoTest", description: "test uniUpdate", … } 1: Object { id: 94, name: "autoTest", description: "test uni", … }
​let obj2 = {};
if (options.length > 0) {
  options.map((item, key) => {
    const id = item.id;
    const name = item.name;
    let obj1 = { [id]: name };
    console.log(obj1); // Object { 44: "autoTest" } for example
    obj2 = { ...obj1 };
  });
  console.log(obj2); // Object { 16: "Test 3" } is called like two times and is obviously not what I expected
}

Некоторые подсказки?

Ответы [ 5 ]

1 голос
/ 06 февраля 2020

Это не должно быть настолько сложным. Вы можете упростить это, используя reduce():

const data = [
  {
    id: 1, 
    name: "test", 
    description: "a description"
  }, 
  {
    id: 2, 
    name: "test 2", 
    description: "a description french baguette"
  }
]

const result = data.reduce((a, { id, name }) => ({ ...a, [id]: name }), {});
console.log(result);
1 голос
/ 06 февраля 2020

Это можно упростить с помощью map и Object.fromEntries или reduce:

var arr = [ { id: 1, name: "test"  , description: "a description" }, 
            { id: 2, name: "test 2", description: "a description french baguette" } ]

var obj1 = Object.fromEntries(arr.map(o => [o.id, o.name]))

var obj2 = arr.reduce((o, v) => (o[v.id] = v.name, o), {})

console.log( obj1 )
console.log( obj2 )
1 голос
/ 06 февраля 2020

Я бы использовал метод массива с именем forEach до l oop через каждое значение (в данном случае объект) в массиве

const arr = [{id: 1, name: "test", description: "a description"}, {id: 2, name: "test 2", description: "a description french baguette"}]

const newObj = {}

arr.forEach(item => newObj[item.id] = item.name)
// console.log(newObj) >>>>>> {1: "test", 2: "test 2"}

Я чувствую, что это само за себя. Дайте мне знать, если какая-либо часть не ясна.

0 голосов
/ 06 февраля 2020

Более простой подход с forEach () и оператором распространения:

const data = [
  {
    id: 1, 
    name: "test", 
    description: "a description"
  }, 
  {
    id: 2, 
    name: "test 2", 
    description: "a description french baguette"
  }
];

let output = {};
data.forEach((item) => {output = {...output, [item.id]: item.name};});

вывод: { 1: "test", 2: "test 2" }

0 голосов
/ 06 февраля 2020

Как я уже говорил, вы должны использовать функцию forEach или даже reduce.

let arr = [{id: 1, name: "test", description: "a description"}, {id: 2, name: "test 2", description: "a description french baguette"}],
    result = arr.reduce((a, {id, name}) => Object.assign(a, {[id]: name}), Object.create(null));

console.log(result);
...