преобразовать вложенный массив в массив объектов, используя функцию более высокого порядка - PullRequest
1 голос
/ 01 февраля 2020

У меня сейчас есть этот ввод:

[
  [['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
  [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]
];

Вывод должен быть следующим:

[
  { firstName: 'Joe', lastName: 'Blow', age: 42, role: 'clerk' },
  { firstName: 'Mary', lastName: 'Jenkins', age: 36, role: 'manager' }
];

Я написал следующий код:

function transformEmployeeData(array) {
  let newArr = [];

  for(var i = 0; i< array.length; i++) {
    let newObj = {}
    for(var j = 0; j< array[i].length; j++) {
      newObj[array[i][j][0]] = array[i][j][1]
    }
    newArr.push(newObj);
  }

  return newArr; 
}

Однако Я хочу попробовать использовать функции .map() и .reduce(). Как я могу их реализовать?

1 Ответ

2 голосов
/ 01 февраля 2020

Самый простой способ - это, вероятно, использовать .map(), а затем использовать Object.fromEntries() в качестве функции отображения следующим образом:

const arr = [
  [['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
  [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]
];

const res = arr.map(Object.fromEntries);
console.log(res);

Однако, если вы действительно хотите использовать .reduce(), тогда вы можете использовать .map() и .reduce() для создания своих объектов для вас :

const arr = [
  [['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
  [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]
];

const res = arr.map(
  entries => entries.reduce((acc, [key, value]) => ({...acc, [key]: value}), {})
);
console.log(res);

Выше используется .reduce() для перебора парных массивов [key, value] во ваших внутренних массивах. Для каждой пары ключ-значение вы можете деструктурировать (([key, value]) =>), чтобы извлечь key и value из массива. Затем вы можете вернуть объект, который будет использоваться в качестве следующего значения для эмулятора acc. Возвращаемый вами объект является встроенным объектом из acc (который изначально {}) и текущей парой ключ-значение. Это делается с использованием синтаксиса распространения (...) с именами вычисляемых свойств ({[key]: value}).


Одним из последних подходов будет сопоставление каждый внутренний [key, value] для объекта:

[ 
  [ { "firstName": "Joe" }, { "lastName": "Blow" }, { "age": 42 }, { "role": "clerk" } ], 
  [ { "firstName": "Mary" }, { "lastName": "Jenkins" }, { "age": 36 }, { "role": "manager" } ] 
]

Затем вы можете сопоставить этот массив с массивом объектов, используя Object.assign(), причем каждый аргумент для Object.assign() равен объекты из внутренних массивов. Это «объединит» каждый объект в массиве, чтобы сформировать один больший объект:

const arr = [
  [['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
  [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]
];

const res = arr.map(
  entries => entries.map(([k, v]) => ({[k]: v}))
).map(arr => Object.assign(...arr));
console.log(res);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...