Как преобразовать массив из нескольких записей в объект? - PullRequest
2 голосов
/ 13 января 2020
const array = [['Team A', 'City A', '100'],['Team B', 'City A', '80'],['Team C', 'City A', '90']];
const map = array.map(x => {
  let output = {};
  output[x[0]] = {team: x[0], city: x[1], points: x[2]};
  return output
});
console.log(JSON.stringify(map));

И я получаю результат вывода, как показано ниже

[{"Team A":{"team":"Team A","city":"City A","points":"100"}},
 {"Team B":{"team":"Team B","city":"City A","points":"80"}},
 {"Team C":{"team":"Team C","city":"City A","points":"90"}}]

И требуется

{"Team A": {"team": "Team A","city": "City A","points": "100"},
 "Team B": {"team": "Team B","city": "City A","points": "80"},
 "Team C": {"team": "Team C","city": "City A","points": "90"}}

Ответы [ 5 ]

4 голосов
/ 13 января 2020

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

const restructure = (teams) =>
  teams .reduce ((a, [team, city, points]) => ({...a, [team]: {team, city, points}}), {})

const array = [['Team A', 'City A', '100'],['Team B', 'City A', '80'],['Team C', 'City A', '90']];

console .log (restructure (array))

Это далеко не самый производительный код. Отличная статья от Rich Snapp объясняет, почему и как это исправить. Но я лично буду придерживаться этого, если это не станет узким местом в моем приложении.

3 голосов
/ 13 января 2020

Array.reduce собирается l oop через исходный массив и построить новый объект. Мы деструктурируем аргумент, чтобы быстро создать наш новый ключ, используя положение данных внутри исходного массива. Затем мы используем синтаксис ,, чтобы сказать «назначить ключ, а затем вернуть tmp переменная»

const format = [
  [
    'Team A',
    'City A',
    '100',
  ],
  [
    'Team B',
    'City A',
    '80',
  ],
  [
    'Team C',
    'City A',
    '90',
  ],
].reduce((tmp, [
  team,
  city,
  points,
]) => (tmp[team] = {
  team,
  city,
  points,
}, tmp), {});

console.log(format);
3 голосов
/ 13 января 2020

Вы можете использовать reduce, чтобы создать такой объект (map дает вам массив):

const array = [['Team A', 'City A', '100'],
               ['Team B', 'City A', '80'],
               ['Team C', 'City A', '90']];
const result = array.reduce((a, [team, city, points]) => {
  a[team] = {team, city, points};
  return a;
}, {});
console.log(JSON.stringify(result, null, 2));
1 голос
/ 13 января 2020

Я удивлен, простой для ... из l oop пока не упоминается.

const array = [['Team A', 'City A', '100'],['Team B', 'City A', '80'],['Team C', 'City A', '90']];

const output = {};
for (const [team, city, points] of array) {
  output[team] = {team, city, points};
}

console.log(output);

Причина, по которой ваш текущий код не работает, заключается в том, что вы вызываете array.map, который по своей природе возвращает новый массив, а не объект. Кроме того, вы создаете новый объект output в каждой итерации array.map, тогда как должен быть только один объект output, содержащий различные команды.

Обратите внимание, что в этом ответе используется разрушающее назначение и буквенное обозначение ES2015 .

Вот версия, которая больше похожа на ту, что у вас есть в настоящее время, но использует forEach вместо map. Это присваивает output перед итерацией, обновляя output каждую итерацию.

const array = [['Team A', 'City A', '100'],['Team B', 'City A', '80'],['Team C', 'City A', '90']];

const output = {};
array.forEach(x => {
  output[x[0]] = {team: x[0], city: x[1], points: x[2]};
});

console.log(output);
1 голос
/ 13 января 2020

Пожалуйста, используйте приведенный ниже фрагмент

function mapArray(arr) {
   return arr.reduce((acc, curr) => {
    const [ team, city, points ] = curr;
    acc[team] = {
      team, city, points
    };
    return acc;
   }, {});
}

const array = [['Team A', 'City A', '100'],['Team B', 'City A', '80'],['Team C', 'City A', '90']];

console.log(mapArray(array));
...