获取和设置与字符串链接的嵌套对象属性

时间:2018-11-28 17:53:20

标签: javascript loops object for-loop

在我的项目中,我需要访问对象属性和嵌套对象属性并将它们保存到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 = {

..

}

1 个答案:

答案 0 :(得分: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));

相关问题