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