首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按数组值对嵌套的对象数组进行扁平和排序

按数组值对嵌套的对象数组进行扁平和排序
EN

Stack Overflow用户
提问于 2021-04-02 02:57:35
回答 1查看 334关注 0票数 0
代码语言:javascript
复制
// My data is like this
const data = [
  { 
    id: 1,
    color: "red",
    time: [ 
     { start: new Date("2021-4-3"), end: new Date("2021-4-4") }, 
     { start: new Date("2021-4-2"), end: new Date("2021-4-3") }
    ]
  },
  {
    id: 2,
    color: "blue",
    time: [ 
     { start: new Date("2021-4-2"), end: new Date("2021-4-3") }
    ]
  }
]

我想对时间进行排序,然后像下面这样调整数据。

代码语言:javascript
复制
[
  { id: "1-0", start: new Date("2021-4-2"), end: new Date("2021-4-3"), color: "red" },
  { id: "1-1", start: new Date("2021-4-3"), end: new Date("2021-4-4"), color: "red" },
  { id: "2-0", start: new Date("2021-4-2"), end: new Date("2021-4-3"), color: "blue" },
]

我想知道是否有更好的算法来处理这种情况?下面是我的尝试。(我还尝试了ES6语法reduceflatMapflat,但我找不到更好的方法来处理这种情况。)

代码语言:javascript
复制
let arr = [];
let timeLength = 0;
for (let i = 0; i < data.length; i++) {
  timeLength = data[i].time.length;
  if (timeLength !== 1) {
    data[i].time.sort((a, b) => new Date(a.start) - new Date(b.start)); // sort time
  }
  for (let j = 0; j < timeLength; j++) {
    arr.push({
      id: data[i].id + "-" + i,
      color: data[i].color,
      start: data[i].time[j].start,
      end: data[i].time[j].end,
    });
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-02 14:09:17

我在您的代码中看到了一个实质性的慢速:在sort调用中,您正在重复调用new Date(...)。没有理由这样做。您的字段已经是日期,因此您可以按原样使用它们。我更喜欢使用flatMapmap,所以我的版本如下所示:

代码语言:javascript
复制
const convert = (data) =>
  data .flatMap (
    ({time, ...rest}) => [...time] .sort ((a, b) => a .start - b .start) 
                                   .map (t => ({...rest, ...t}))
  )

const data = [{id: 1, color: "red", time: [{start: new Date("2021-4-3"), end: new Date("2021-4-4")}, {start: new Date("2021-4-2"), end: new Date("2021-4-3")}]}, {id: 2, color: "blue", time: [{start: new Date("2021-4-2"), end: new Date("2021-4-3")}]}]

console .log (convert (data))
代码语言:javascript
复制
.as-console-wrapper {max-height: 100% !important; top: 0}

如果您使用的不是Date对象,而是具有2021-04-03格式的字符串,那么您也可以直接排序,而无需任何Date实例化:

代码语言:javascript
复制
   [...time] .sort (({start: s1}, {start: s2}) => s1 < s2 ? -1 : s1 > s2 ? 1 : 0)

如果输入对象完全没有用处,您可以跳过time的浅克隆,将[...time] .sort (...)替换为time .sort (...)。但这不会带来什么好处,你的原始数据的变异可能会有问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66913907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档