Конвертировать вложенный массив в массив объектов задачи - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь преобразовать данные этого вложенного массива в массив объектов.Вот данные.

  const tableData = [
    ["first_name", "last_name", "city", "state"],
    ["June", "Gregory", "Hammond", "IN"],
    ["James", "Wynn", "Gary", "IN"],
    ["Craig", "Norman", "Schererville", "IN"]
  ]

Вот что должно быть на выходе

[
  { first_name : "June", last_name : "Gregory", city: "Hammond", state : "IN" },
  { first_name : "James", last_name : "Wynn", city: "Gary", state : "IN" },
  { first_name : "Craig", last_name : "Norman", city: "Schererville", state : "IN" }
]

Вот мой код.

    function convertTable(table_data) {
var result = []
var key, value
for (var i=0; i<table_data.length; i++) {
  var employee = {}
  for (var j=0; j<table_data[i].length; j++) {
    key = table_data[i][j][0]
    value = table_data[i][j][1]
    employee[key] = value
   }
   result.push(employee)
  }
  return result
 }

  var input = [
    ["first_name", "last_name", "city", "state"],
    ["June", "Gregory", "Hammond", "IN"],
    ["James", "Wynn", "Gary", "IN"],
    ["Craig", "Norman", "Schererville", "IN"]
  ]

console.log(convertTable(input));

Решение заключается в распечатке первых букв слов вместо всего слова.Мне трудно понять, почему.Я спрашиваю, могут ли комментаторы оставлять комментарии построчно, чтобы помочь моему пониманию этой программы.Я написал это с помощью исследования похожих проблем, но все еще с трудом разбираюсь.Я читал о Javascript на w3schools, MDN, и смотрел видео на YouTube с объяснениями.Любая другая помощь будет оценена, спасибо.

Ответы [ 5 ]

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

Вот краткая версия с использованием Array.reduce:

const data = [["first_name", "last_name", "city", "state"], ["June", "Gregory", "Hammond", "IN"], ["James", "Wynn", "Gary", "IN"], ["Craig", "Norman", "Schererville", "IN"]]

const result = data.reduce((r,c,i,arr) => {
  if(i) r.push(c.reduce((a,b,j) => (a[arr[0][j]] = b, a), {}))
  return r
}, [])
console.log(result)

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

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

Ваш код содержит три ошибки, которые можно исправить следующим образом:

  1. Начните итерацию внешнего цикла с i = 1, чтобы пропустить заголовки с индексом 0.

  2. Индексировать в массив заголовков с помощью tableData[0][j] вместо tableData[i][j][0], что на одно измерение слишком много (доступ к символам) и неправильно включает индекс строки i.

  3. Индексируйте в вашей таблице данных с помощью tableData[i][j] вместо tableData[i][j][1], который снова обращается к символам в ваших строках.

Помимо этого, я рекомендую обратить внимание на интервал,точки с запятой и соглашения о верблюде.Это облегчит понимание и отладку вашего кода.

Если собрать его вместе, получится:

function convertTable(tableData) {
  var result = [];
  var key;
  var value;
  
  for (var i = 1; i < tableData.length; i++) { // start at 1 to skip headers
    var employee = {};
    
    for (var j = 0; j < tableData[i].length; j++) {
      key = tableData[0][j];   // remove character index and use [0][j]
      value = tableData[i][j]; // remove character index
      employee[key] = value;
    }
    
    result.push(employee);
  }
  
  return result;
}

var input = [
  ["first_name", "last_name", "city", "state"],
  ["June", "Gregory", "Hammond", "IN"],
  ["James", "Wynn", "Gary", "IN"],
  ["Craig", "Norman", "Schererville", "IN"]
];

console.log(convertTable(input));

Кроме того, для функций массива map и reduce это отличная задача - выполнить преобразование CSV в объект.shift() выдвигает заголовки из передней части массива, map перебирает строки и применяет reduce к каждому.reduce создает объект с использованием i и j индексов строк / столбцов для ссылки на массив заголовков таким же образом, как ваша функция.

const tableData = [
  ["first_name", "last_name", "city", "state"],
  ["June", "Gregory", "Hammond", "IN"],
  ["James", "Wynn", "Gary", "IN"],
  ["Craig", "Norman", "Schererville", "IN"]
];

const headers = tableData.shift();
const result = tableData.map((e, i) => 
  e.reduce((a, f, j) => {
    a[headers[j]] = f;
    return a;
  }, {})
);

console.log(result);
0 голосов
/ 30 ноября 2018

Попробуйте это,

Вы просто потеряли некоторый индекс, за исключением того, что все в порядке.Просто соответствуйте своей функции, и вы сможете легко найти, где вы пропустили.

  const tableData = [
    ["first_name", "last_name", "city", "state"],
    ["June", "Gregory", "Hammond", "IN"],
    ["James", "Wynn", "Gary", "IN"],
    ["Craig", "Norman", "Schererville", "IN"]
  ]


    function convertTable(table_data) {
var result = []
var key, value
for (var i=1; i<table_data.length; i++) {
  var employee = {}
  for (var j=0; j<table_data[i].length; j++) {
    key = table_data[0][j]
    value = table_data[i][j]
    employee[key] = value
   }
   result.push(employee)
  }
  return result
 }

  var input = [
    ["first_name", "last_name", "city", "state"],
    ["June", "Gregory", "Hammond", "IN"],
    ["James", "Wynn", "Gary", "IN"],
    ["Craig", "Norman", "Schererville", "IN"]
  ]

console.log(convertTable(input));
  { first_name : "June", last_name : "Gregory", city: "Hammond", state : "IN" },
  { first_name : "James", last_name : "Wynn", city: "Gary", state : "IN" },
  { first_name : "Craig", last_name : "Norman", city: "Schererville", state : "IN" }
] */
0 голосов
/ 30 ноября 2018

Вы обращались к глубине 3-level в корневом массиве, поэтому вы индексировали строки внутри массивов 2-level.

Используя это: key = table_data[i][j][0] вы обращались к первому символу j-placed строка внутри массива по индексу i.

И используя это: value = table_data[i][j][1] вы обращались ко второму символу j-placed строки внутри массива по индексу i.

Кроме того, вы уже знаете, что первый массив - это ключи (или заголовки), поэтому вы не хотите зацикливаться на нем.Проверьте следующий пример:

function convertTable(table_data)
{
    var result = [];
    var key, value;
    
    for (var i = 1; i < table_data.length; i++)
    {
        var employee = {};

        for (var j = 0; j < table_data[i].length; j++)
        {
            key = table_data[0][j];
            value = table_data[i][j];
            employee[key] = value;
        }

        result.push(employee);
     }
     
     return result;
 }

  var input = [
    ["first_name", "last_name", "city", "state"],
    ["June", "Gregory", "Hammond", "IN"],
    ["James", "Wynn", "Gary", "IN"],
    ["Craig", "Norman", "Schererville", "IN"]
  ]

console.log(convertTable(input));
0 голосов
/ 30 ноября 2018

Прежде всего, вы взяли для обоих значений один символ, который не является обязательным,

key = table_data[i][j][0]
//                    ^^^
value = table_data[i][j][1]
//                      ^^^

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

Другое изменение заключается в объявлении всех переменных в верхней части функции.

function convertTable(table_data) {
    var result = [],
        key, value,
        employee,
        i, j;

    for (i = 1; i < table_data.length; i++) {        // start from index 1
        employee = {};
        for (j = 0; j < table_data[i].length; j++) {
            key = table_data[0][j];                  // take the value form index zero
                                                     // no following index for the letter
            value = table_data[i][j];                // no following index for the letter
            employee[key] = value;
        }
        result.push(employee);
    }
    return result;
}

var input = [["first_name", "last_name", "city", "state"], ["June", "Gregory", "Hammond", "IN"], ["James", "Wynn", "Gary", "IN"], ["Craig", "Norman", "Schererville", "IN"]]

console.log(convertTable(input));
.as-console-wrapper { max-height: 100% !important; top: 0; }

Другой подход

function convertTable(table) {
    return table
        .slice(1)
        .map(a => Object.assign(...table[0].map((k, i) => ({ [k]: a[i] }))));
}

var input = [["first_name", "last_name", "city", "state"], ["June", "Gregory", "Hammond", "IN"], ["James", "Wynn", "Gary", "IN"], ["Craig", "Norman", "Schererville", "IN"]]

console.log(convertTable(input));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...