【问题标题】:Using localStorage as a nested dictionary使用 localStorage 作为嵌套字典
【发布时间】:2015-07-02 04:13:38
【问题描述】:

我在stackoverflow上看到了当前的解决方案,例如:

Storage.prototype.setObject = function(key, value) {
    this.setItem(key, JSON.stringify(value));
}

Storage.prototype.getObject = function(key) {
    var value = this.getItem(key);
    return value && JSON.parse(value);
}

但我正在尝试做类似的事情: localStorage[a][b] = 5 带有函数调用 localStorage.setItem('a', 'b', 5)。

我目前的代码由于引用问题而无法正常工作:

Storage.prototype.setVal = function(key, val) {
    var val = Array.prototype.pop.call(arguments);
    var cur_depth = this;
    for (var i in arguments) {
        var cur_key = arguments[i];
        cur_depth = JSON.parse(cur_depth[cur_key]);
    }
    cur_depth = JSON.stringify(val);
}

我最后一次,甚至更老套的尝试:

Storage.prototype.setVal = function(key, val) {
    var val = JSON.stringify(Array.prototype.pop.call(arguments));
    var keys = ''; // hacky eval solution
    for (var i in arguments) {
        var cur_key = arguments[i];
        keys += '["' + cur_key + '"]';
    }
    eval('this' + keys + '=' + val);
}

【问题讨论】:

    标签: javascript html dictionary nested local-storage


    【解决方案1】:

    有点理论(就像我的头顶一样),但我会做类似的事情:

    Storage.prototype.setVal = function () { var args = Array.prototype.slice.call(arguments); var key = args.shift(); var val = args.pop(); var curr, obj; curr = obj = this.getObject(key); while (args.length > 0) { curr = curr[args.shift()]; } curr = val; this.setObject(key, JSON.stringify(obj)); }

    如果你能用你的代码做一个 plunkr 会更好,因为我更喜欢验证我在写什么。

    【讨论】:

      【解决方案2】:

      围绕这些线的东西可能会起作用。如果您对整个字典使用单个存储对,则可以稍微简化一下(现在处理第一个键需要额外注意)。

      Storage.prototype.setVal = function () {
        var args = Array.prototype.slice.call(arguments);
      
        var storageKey = args.shift();
        var value = args.pop();
      
        var storageValue = this.getItem(storageKey);
      
        if (args.length === 0) {
          storageValue = value;
        } else {
          if (!storageValue) {
              storageValue = {};
          } else {
            if (typeof storageValue !== 'object') {
              storageValue = {};
            }
          }
      
          recursiveSet(storageValue, args, value);
        }
      
        this.setItem(storageKey, JSON.stringify(storageValue));
      };
      
      function recursiveSet(object, keys, value) {
        for (var i in keys) {
          if (i == keys.length - 1) {
            object[keys[i]] = value;
          } else {
            if (!object[keys[i]] || typeof object[keys[i]] !== 'object') {
              object[keys[i]] = {};
            }
          }
          object = object[keys[i]];
        }
      }
      

      这里是plunkr

      【讨论】:

        猜你喜欢
        • 2010-12-08
        • 1970-01-01
        • 2020-08-07
        • 1970-01-01
        • 2016-11-14
        • 1970-01-01
        • 2022-01-25
        • 2021-09-27
        • 2015-07-03
        相关资源
        最近更新 更多