JS Преобразует объект со свойствами в виде массива в список объектов массива

#javascript #arrays #object

Вопрос:

У меня есть следующие поступающие данные (уменьшенные объекты для более легкого понимания). Мои свойства могут включать от сотен до тысяч свойств.

 teams = {
  teams: ['Lakers', 'Clippers', 'Bucks', 'Suns'],
  states: ['California', 'California', 'Wisconsin', 'Arizona']
}
 

Обратите внимание, что свойства всегда будут содержать одинаковое количество элементов для каждого.

Я хотел бы преобразовать его в список объектов массива:

 teamsList = [
  { teams: 'Lakers', states: 'California' },
  { teams: 'Clippers', states: 'California' },
  { teams: 'Bucks', states: 'Wisconsin' },
  { teams: 'Suns', states: 'Arizona' }
]
 

Это то, что я изначально имел в виду и пытался:

 const parseData = (obj) => {
  const teams = obj.teams;
  const states = obj.states;
  let newArrayList = [];
  teams.forEach((item, index) => {
    const teamData = {
      teams: item,
      states: states[index]
    }
    newArrayList.push(teamData);
  })

  return newArrayList;
}

 

Мне интересно, есть ли более оптимальный способ сделать это?

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

   teams.forEach((item, index) => {
    const teamData = {
      teams: item,
      states: states[index],
      n: n[index]
    }
    newArrayList.push(teamData);
  })

 

Где n соответствует любому количеству возможных ключей объектов.

Спасибо.

Ответ №1:

Это решение работает, сначала определяя длину самого длинного массива, а затем динамически создавая новые объекты на основе ключей, доступных в ваших данных:

 const data = {
  teams: ['Lakers', 'Clippers', 'Bucks', 'Suns'],
  states: ['California', 'California', 'Wisconsin', 'Arizona']
};

const result = [
  ...Array(Object.values(data).reduce((a, {length}) => Math.max(a, length), 0))
].map((_, i) => Object.keys(data).reduce((a, k) => ({...a, [k]: data[k][i]}), {}));

console.log(result); 

Ответ №2:

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

 const teams = {
  teams: ['Lakers', 'Clippers', 'Bucks', 'Suns'],
  states: ['California', 'California', 'Wisconsin', 'Arizona']
};
const teamList = teams.teams.map((t, i) => ({ teams: t, states: teams.states[i] }));
console.log(teamList); 

Если у вас много свойств, выполните итерацию по записям.

 const teams = {
  teams: ['Lakers', 'Clippers', 'Bucks', 'Suns'],
  states: ['California', 'California', 'Wisconsin', 'Arizona']
};
const entries = Object.entries(teams);
const [key, arr] = entries.shift();
const teamList = arr.map((val, i) => Object.fromEntries(
    [[key, val]].concat(
      entries.map(entry => [entry[0], entry[1][i]])
    )
));
console.log(teamList); 

Комментарии:

1. На самом деле у меня также есть реализация .map (), но я думаю, что я действительно искал дальше, как определить объект для каждого свойства объекта, но без полного написания каждого нового свойства (т. Е. {teams: t, states: teams.states[i], ...n: teams.n[i]} )

2. См. раздел Редактирование, затем вам придется повторить все записи

Ответ №3:

Используйте Array.map() , который будет повторять каждый элемент и возвращать конечный массив объекта.

 teams = {
  teams: ['Lakers', 'Clippers', 'Bucks', 'Suns'],
  states: ['California', 'California', 'Wisconsin', 'Arizona']
};

const parseData = (obj) => {
  const states = teams.states;
  return obj.teams.map((teams, index) => ({ teams, states: states[index] }));
}

console.log(parseData(teams));