Преобразовать массив объектов с одинаковыми свойствами в один объект со значениями массива - PullRequest
2 голосов
/ 13 марта 2019

let data = [
  {firstName: 'John', lastName: 'Doe'},
  {firstName: 'Mike', lastName: 'Smith'}
]

console.log(data)

Я хочу преобразовать это в один объект, подобный этому

obj = {firstName: ['John', 'Mike'], lastName: ['Doe', 'Smith']}

я должен использовать уменьшить?

Ответы [ 6 ]

2 голосов
/ 13 марта 2019

Универсальное решение с методом Array#reduce.

let result = data.reduce((obj, o) => {
  // get all keys of object
  Object.keys(o)
    // iterate over the keys
    .forEach(k => {
      // define property if not defined
      obj[k] = obj[k] || [];
      // push the value to the array
      obj[k].push(o[k]);
    })
  // return object
  return obj;
  // set initial value as an object for result
}, {})

let data = [{
    firstName: 'John',
    lastName: 'Doe'
  },
  {
    firstName: 'Mike',
    lastName: 'Smith'
  }
]

let result = data.reduce((obj, o) => {
  Object.keys(o)
    .forEach(k => {
      obj[k] = obj[k] || [];
      obj[k].push(o[k]);
    })
  return obj;
}, {})

console.log(result)
2 голосов
/ 13 марта 2019

Вы можете использовать Reducer для создания новой версии объекта.

Метод Reduce () выполняет функцию редуктора (которую вы предоставляете) для каждого членамассив, приводящий к единственному выходному значению.

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

let data = [
  {firstName: 'John', lastName: 'Doe'},
  {firstName: 'Mike', lastName: 'Smith'}
]

// o = the current output value
// i = the current item in the array
let result = data.reduce((o, i) => {
  // Add the first/last names to the corresponding array
  o.firstName.push(i.firstName)
  o.lastName.push(i.lastName)
  // Return the new current output value
  return o
}, { firstName: [], lastName: [] }) // Sets the initial output value

console.log(result)
1 голос
/ 13 марта 2019

let data = [
  {firstName: 'John', lastName: 'Doe'},
  {firstName: 'Mike', lastName: 'Smith'}
]

var firstName = [];var lastName = [];
data.forEach(function(item){
    firstName.push(item.firstName);
    lastName.push(item.lastName);
})

let obj = {};
obj.firstName = firstName;
obj.lastName = lastName;

let dataModified = [];
dataModified.push(obj);

console.log(dataModified);
0 голосов
/ 13 марта 2019

Вот одно итерационное, функциональное, не мутирующее решение:

let data = [
  {firstName: 'John', lastName: 'Doe'},
  {firstName: 'Mike', lastName: 'Smith'}
]

let result = data.reduce((res, {firstName, lastName}) => ({
  firstName: [firstName, ...res.firstName],
  lastName:  [lastName,  ...res.lastName]
}), {firstName: [], lastName: []})

console.log(result)
0 голосов
/ 13 марта 2019

Еще одна простая вещь, которую мы можем сделать, это вызвать map два раза, один раз для имени и один раз для фамилии.

let data = [
  {firstName: 'John', lastName: 'Doe'},
  {firstName: 'Mike', lastName: 'Smith'}
]

let result = { 
  firstName: data.map(i => i.firstName), 
  lastName: data.map(i => i.lastName) 
}

console.log(result)
0 голосов
/ 13 марта 2019

Вы также можете сделать логику более общей, независимо от известных свойств

let data = [{
    firstName: 'John',
    lastName: 'Doe'
  },
  {
    firstName: 'Mike',
    lastName: 'Smith'
  }
]

let result = data.reduce((o, i) => {
  for (const key in i) {
    if (!o[key]) {
      o[key] = [];
    }
    o[key].push(i[key]);
  }
  return o
}, {})

console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...