Как я могу построить новый объект из этих свойств? - PullRequest
0 голосов
/ 21 ноября 2018

Итак, это мой объект:

const data = [ { 
    main: 7,
    second: 2
    otherData: 'some string'
 } ]

Мне нужно сделать новый объект из определенных свойств, поэтому в итоге он должен выглядеть так:

const newData = {
    7: {
     second: 2
    }
  }

Я пытался решить ее, используя .reduce(), но не могу понять, как пропустить некоторые свойства.

const newData = data.reduce((obj, curr, index) => {
  return {
    ..obj, [index]: curr
  };
}, {});

производит:

{ '0':
   { main: 7,
     second: 3
   } 
}

Что такоеЯ делаю не так?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Вместо уменьшения вы можете попробовать forEach, как показано ниже

let retData = {};


data.forEach(({ main, second }) => {
retData[main] = {second};
});

В этом конкретном случае вывод будет:

retData = {
 7: {
      second: 2
    }
}
0 голосов
/ 21 ноября 2018

Уменьшите меня, HOD вызывается на массив.В вашем случае у вас есть только один объект в массиве.Таким образом, «0» представляет «[@index]», и ваш единственный объект Cild отображается на «curr»

0 голосов
/ 21 ноября 2018

Вы объединяете массивы и объекты.Если я правильно понимаю, то, что вы хотите, это:

const newData = data.map(obj => {
  return {
    [obj.main]: {
      second: obj.second
    }
  };
});

Учитывая ваш пример ввода

const data = [ { 
    main: 7,
    second: 2
    otherData: 'some string'
 } ];

Это вернет

[
  {
    7: {
      second: 2
    }
  }
]

Обновление от комментария

Похоже, вы действительно хотите уменьшить здесь.Используйте это:

const reduced = data.reduce((acc, {main, second}, index) => {
  acc[main] = {second, index};
  return acc;
}, {});

Что для вашего примера ввода дает

{
  '7': {
    second: 2,
    index: 0
  }
}

Обратите внимание, что, как я сказал ниже, будьте осторожны, потому что объект с тем же main, что и предыдущий будет перезаписывать предыдущую запись.

...