Использование .reduce для объекта, содержащего элементы массива, для преобразования его в массив - PullRequest
0 голосов
/ 11 мая 2018

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

Вот что я пытаюсь сделать:

data1 = [{
  a: 1,
  b: ["uz", "vy"]
}, {
  a: 2,
  b: ["wxa", "xwy"]
}, {
  a: 6,
  b: ["ysa", "zaa"]
}]

data1.reduce(function(q, w) {
  return q.b.concat(w.b)
})

Я хочу, чтобы окончательные данные выглядели так:

data1 = ["uz","vy","wxa","xwy","ysa","zaa"]

Однако это выдает сообщение об ошибке:

"Uncaught TypeError: Cannot read property 'concat' of undefined"

Если q.b ссылается на массив внутри объекта, почему у него нет свойства concat?Что я здесь не так делаю?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Передать начальное значение в функцию reduce.Кроме того, q.b не будет допустимым значением при первом вызове.Вместо этого вы хотели указать q:

data1 = [{
  a: 1,
  b: ["uz", "vy"]
}, {
  a: 2,
  b: ["wxa", "xwy"]
}, {
  a: 6,
  b: ["ysa", "zaa"]
}]

var result = data1.reduce(function(q, w) {
  return q.concat(w.b);
}, [])

console.log(result);
0 голосов
/ 11 мая 2018

Вы получаете ошибку, потому что q является массивом, а не объектом со свойством b.И вы не добавили начальное значение.

Вы можете concat и map

let data1 = [{a: 1,b: ["uz", "vy"]}, {a: 2,b: ["wxa", "xwy"]}, {a: 6,b: ["ysa", "zaa"]}];

let result = [].concat(...data1.map(o => o.b));

console.log(result);

Если вы хотите использовать reduce, вы можете:

let data1 = [{a: 1,b: ["uz", "vy"]}, {a: 2,b: ["wxa", "xwy"]}, {a: 6,b: ["ysa", "zaa"]}];

let result = data1.reduce(function(q, w) {
  return q.concat(w.b);
}, []); //<-- Add [] to initiate the initial value

console.log(result);
...