【问题标题】:Restructuring data-structure to a new Schema - Javascript将数据结构重构为新模式 - Javascript
【发布时间】:2019-07-07 11:55:54
【问题描述】:

我需要重组一个已经存在的数据结构,但不知道如何以最有效的方式做到这一点(如果我应该使用自己的自定义函数或使用第三方库)。

数据: 可能有也可能没有一个月或一天,即如果用户从未输入过数据,那么数据结构将如下所示{}

2019: {        // year
  7: {         // month
    6: {       // day
      activities: (4) [{…}, {…}, {…}, {…}]
      emotionsFelt: (3) ["Excited", "Nervous", "Happy"]
      isSpecialDay: false
      latitude: null
      locationId: null
      locationName: null
      locationProvider: null
      longitude: null
      mood: "Awesome"
      optionalDescription: ""
      rating: 5
      timestamp: "2019-07-06T18:52:38.022Z"
    },
    7: {
      activities: []
      emotionsFelt: (2) ["Excited", "Lively"]
      isSpecialDay: false
      latitude: 56.130366
      locationId: "ChIJ2WrMN9MDDUsRpY9Doiq3aJk"
      locationName: "Canada"
      locationProvider: "GM"
      longitude: -106.346771
      mood: "Awesome"
      optionalDescription: ""
      rating: 5
      timestamp: "2019-07-06T19:00:18.391Z"
    }
  }
}

结果应该是:

2019: {        // year
  7: {         // month
    6: {       // day
      avgRating: 5,
      isSpecialDay: false,
      entries: [
        {
          activities: [{…}, {…}, {…}, {…}],
          emotionsFelt: ["Excited", "Nervous", "Happy"],
          isSpecialMoment: false,
          latitude: null,
          locationId: null,
          locationName: null,
          locationProvider: null,
          longitude: null,
          mood: "Awesome",
          optionalDescription: "",
          rating: 5,
          images: [],
          timestamp: "2019-07-06T18:52:38.022Z",
        }
      ]
    },
    7: {
      avgRating: 5,
      isSpecialDay: false,
      entries: [
        {
          activities: [],
          emotionsFelt: ["Excited", "Lively"],
          isSpecialMoment: false,
          latitude: 56.130366
          locationId: "ChIJ2WrMN9MDDUsRpY9Doiq3aJk"
          locationName: "Canada"
          locationProvider: "GM"
          longitude: -106.346771
          mood: "Awesome",
          optionalDescription: "",
          rating: 5,
          images: [],
          timestamp: "2019-07-06T18:52:38.022Z",
        }
      ]
    }
  }
}

关于如何做到这一点的任何提示? 在此先感谢:)

【问题讨论】:

  • 不清楚您需要在两个对象中更改什么
  • 我希望 day 对象是一个条目数组,而不是单个条目。将当前的rating 映射为avgRating。你需要清楚地知道什么?
  • ok 使用JSON.stringifyJSON.Parse 复制这两个对象,然后编辑该副本。要遍历副本,请使用for in,您可能需要在此处嵌套for ins。对我来说看起来很简单,除非您可以在迄今为止尝试的内容中指定一个问题,而不是我该如何完成这个!
  • 好吧,我正试图获得一些指导,因为我知道我可以使用 for..ins 做到这一点。它对我来说看起来有点乱,或者可能有第三方库。无论如何,谢谢!

标签: javascript arrays json object


【解决方案1】:

使用嵌套的for...in 循环、解构、扩展和速记属性表示法,如下所示:

let obj = {2019:{7:{6:{activities:["one","two","three","four"],emotionsFelt:["Excited","Nervous","Happy"],isSpecialDay:false,latitude:null,locationId:null,locationName:null,locationProvider:null,longitude:null,mood:"Awesome",optionalDescription:"",rating:5,timestamp:"2019-07-06T18:52:38.022Z"},7:{activities:[],emotionsFelt:["Excited","Lively"],isSpecialDay:false,latitude:56.130366,locationId:"ChIJ2WrMN9MDDUsRpY9Doiq3aJk",locationName:"Canada",locationProvider:"GM",longitude:-106.346771,mood:"Awesome",optionalDescription:"",rating:5,timestamp:"2019-07-06T19:00:18.391Z"}}}};

for (let year in obj) {
  for (let month in obj[year]) {
    for (let day in obj[year][month]) {
      const { isSpecialDay, rating: avgRating, ...r } = obj[year][month][day];
      obj[year][month][day] = { isSpecialDay, avgRating, entries: [{ isSpecialDay, avgRating, ...r }]};
    }
  }
}

console.log(obj);
.as-console-wrapper { max-height: 100% !important; top: auto; }

【讨论】:

  • 谢谢!!我猜for.. in 就是这样。
  • 是的@WalterMonecke - 这样您就可以访问循环内的每个键。
猜你喜欢
  • 2022-01-21
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 1970-01-01
相关资源
最近更新 更多