#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));