使用JavaScript中的 "reduce "从另一个数组中创建新的数组。

问题描述 投票:-4回答:2

我有一个像这样的数组列表。

var mydata = [
  {"endTime": "123",
  "startTime": "2323",
  "lob" : ["a", "b", "c"]
  },
  {
  "endTime": "454",
  "startTime": "3232",
  "lob" : ["a", "b"]
  },
  {
  "endTime": "4545",
  "startTime": "2322",
  "lob" : ["c"]
  }
]

我想通过这个数组来映射并创建另一个列表,每个 "lob "和[startTime, endTime]都会被添加到一个列表中,就像下面这样。

[
{"item": "a" , timeRange: [123, 2323] },
{"item": "b" , timeRange: [123, 2323] },
{"item": "c" , timeRange: [123, 2323] },
{"item": "a" , timeRange: [454, 3232] },
{"item": "b" , timeRange: [454, 3232] },
{"item": "c" , timeRange: [4545, 2322] },
]

我怎样才能像上面那样用reduce创建新的列表?

我已经试过了。

var mymap = mydata.reduce((x, y) => 
    y.lob.map((lob, index) => {
       x.push({"item": lob, "timeRange": [y.startTimestamp, y.endTimestamp]})
    })
  ), [])

我也试过用map. 但如果我有一个大数据, 我想reduce会有更好的性能. 我正在寻找考虑性能的最佳方法。

javascript arrays reduce
2个回答
1
投票

你可以像这样使用 reduce

var mydata = [
  {"endTime": "123",
  "startTime": "2323",
  "lob" : ["a", "b", "c"]
  },
  {
  "endTime": "454",
  "startTime": "3232",
  "lob" : ["a", "b"]
  },
  {
  "endTime": "4545",
  "startTime": "2322",
  "lob" : ["c"]
  }
];

var newdata = mydata.reduce((acc, curr) => {
  curr.lob.forEach(el => {
    acc.push({ item: el, timeRange: [curr.endTime, curr.startTime] });
  });
  return acc;
}, []);
console.log(newdata);

1
投票

而不是使用 reduce(),考虑使用 flatMap() 而不是。

const mydata = [
  { endTime: '123', startTime: '2323', lob: ['a', 'b', 'c'] },
  { endTime: '454', startTime: '3232', lob: ['a', 'b'] },
  { endTime: '4545', startTime: '2322', lob: ['c'] }
];

const result = mydata.flatMap(
  ({ lob, startTime, endTime }) => lob.map(
    item => ({ item, timeRange: [+startTime, +endTime] })
  )
);

console.log(result);
© www.soinside.com 2019 - 2024. All rights reserved.