使用localStorage作为嵌套字典

时间:2015-04-23 19:22:46

标签: javascript html5 dictionary nested local-storage

我已经在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);
}

我的最后一次,甚至更多的hacky尝试:

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);
}

2 个答案:

答案 0 :(得分:0)

有点理论上(比如我的头脑中),但我会做一些像:

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,虽然它会更好,因为我更愿意验证我在写什么。

答案 1 :(得分:0)

这些线路周围的东西可以起作用。如果您对整个字典使用单个存储对,可以简化一下(现在处理第一个密钥需要额外注意)。

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