在包含数组元素的对象上使用 .reduce 将其转换为数组

Using .reduce on an object containing array elements to convert it to array

我正在尝试将包含数组作为其 属性 的对象转换为包含这些嵌套数组中所有元素的数组。

这是我正在尝试做的事情:

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指的是object里面的数组,为什么没有concat属性? 我在这里做错了什么?

您收到错误消息,因为 q 是一个数组,而不是具有 b 属性 的对象。而且你没有加上初始值。

您可以 concatmap

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);

将初始值传递给 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);