【问题标题】:Getting and setting nested objects properties linked with a string获取和设置与字符串链接的嵌套对象属性
【发布时间】:2018-11-28 17:53:19
【问题描述】:

在我的项目中,我需要访问对象属性和嵌套对象属性并将它们保存到 localStorage,并且能够单独检索它们并将当前值替换为存储的值,但我不知道如何使用(例如)for-in 循环。

保存部分运行良好,但如您所见,我对加载部分很不满意。 我曾考虑使用 window["propertyNameAsSring"] 访问该属性,但我了解到您只能通过 window 对象访问全局变量,而不能访问它们的属性。

如果您需要任何说明,请告诉我!

var files = {
  paramsToSave: {
    "game_pageID": game.pageID,
    "game_page_sceneID": game.page.sceneID,
    "events": Events,
    "time_hours": time.hours,
    "time_minutes": time.minutes,
    "time_daysPlayed": time.daysPlayed,
  },
  save() {
    for (param in this.paramsToSave) {
      localStorage[`save_${param}`] = JSON.stringify(this.paramsToSave[param]);
    }
  },
  load() {
    // ?
    // window[this.paramsToSave[param]] = JSON.parse(localStorage[`save_${param}`]);
  }
};

var game = {

..

}

var time = {

..

}

var Events = {

..

}

【问题讨论】:

  • 为什么不this.paramsToSave[param] = JSON.parse(...)
  • @Jonas 因为它会保存到 "files.paramToSave["game_pageID"]" 而不是 "game" 对象中的实际 "game.pageID"
  • 那么不只是game.pageID = getStored("pageID");吗?
  • 因为现在我正在尝试使用 6 个变量,但我需要它来扩展很多,因此我需要类似 for 循环的东西来保存/加载所有变量..

标签: javascript loops object for-loop


【解决方案1】:

如果您只想加载参数,您仍然需要在您的 files 对象中添加一些结构,其中包含 paramsToSave 列表。这将作为可能被序列化的属性的 schema。您不必为它们提供初始值,但您需要指定它们的存储路径。

在此之后,您可能希望在 paramsToSave 结构和实际的全局对象之间交换信息。

如果您想这样做,那么您可能只想为 paramsToSave 的属性编写 getter 和 setter。

var game = { pageID: 'abc123', page: { sceneID: 'sce234' } }; // example
var Events = { placeholder: 'This is the events object' }; // example
var time = { hours: 1, minutes: 2, daysPlayed: 3 }; // example
let mock_localStorage = {}; // mock

var files = {
   
  paramsToSave: {
    get game_pageID() { return game.pageID; },
    set game_pageID(value) { game.pageID = value; },
    
    get game_page_sceneID() { return game.page.sceneID; },
    set game_page_sceneID(value) { game.page.sceneID = value; },
    
    get events() { return Events; },
    set events(value) { Events = value; },
    
    get time_hours() { return time.hours; },
    set time_hours(value) { time.hours = value; },
    
    get time_minutes() { return time.minutes; },
    set time_minutes(value) { time.minutes = value; },
    
    get time_daysPlayed() { return time.daysPlayed; },
    set time_daysPlayed(value) { time.daysPlayed = value; }
  },
  save() {
    for (let param in this.paramsToSave) {
      mock_localStorage[`save_${param}`] = JSON.stringify(this.paramsToSave[param]);
    }
  },
  load() {
    for (let param in this.paramsToSave) {
      this.paramsToSave[param] = JSON.parse(mock_localStorage[`save_${param}`]);
    }
  }
};

files.save();
console.log(mock_localStorage);

// Simulate changing something in localStorage
mock_localStorage[`save_${'time_daysPlayed'}`] = '365';

files.load();
console.log(JSON.stringify(time, null, 2));

【讨论】:

  • 哦,这太完美了!我从不理解 getter 和 setter 的用法,但现在我知道它们什么时候有用了!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
相关资源
最近更新 更多