【发布时间】:2018-07-03 01:17:33
【问题描述】:
我正在开发一些使用处理程序在localStorage 中读取/写入信息的软件。您可以在这里找到一个工作示例:http://jsbin.com/wifucugoko/edit?js,console
我的问题在于下面的代码段(专注于 switch 语句):
_t.set = function(path, value) { // Update a single value or object
if (~path.indexOf(".")) {
let o = path.split(".")[0],
p = this.get(o),
q = path.split(".").slice(1);
switch (q.length) {
// There has to be a better way to do this...
case 1:
p[q[0]] = value;
break;
case 2:
p[q[0]][q[1]] = value;
break;
case 3:
p[q[0]][q[1]][q[2]] = value;
break;
case 4:
p[q[0]][q[1]][q[2]][q[3]] = value;
break;
case 5:
p[q[0]][q[1]][q[2]][q[3]][q[4]] = value;
break;
case 6:
p[q[0]][q[1]][q[2]][q[3]][q[4]][q[5]] = value;
break;
default:
return "error";
}
b.setItem(o, JSON.stringify(p));
return p;
} else {
b.setItem(path, JSON.stringify(value));
return this.get(path);
}
};
我不会是唯一使用此代码库的人,我正在努力让其他人更容易更新可以放在localStorage 中的任何值。现在你可以使用local.set('item.subitem.proeprty', 'value') 之类的东西来更新一个值。虽然上面的代码是这样做的,但它很难看并且不能扩展。
如何改进此方法以 (1) 自动更新嵌套在任意深度的属性,而不是编写无限长的 switch 语句,以及 (2) 不将父对象与 @ 987654328@ 值更新后?
这个问题与我使用localStorage无关。我最初在代码审查中发布了这个问题,这需要一个工作上下文示例。他们立即关闭了这个问题,因为我的部分问题是我提供的代码在您开始处理更新嵌套超过六个对象的值时不起作用。虽然 我可以无限期地继续我的 switch 语句,但这正是我想要避免的。
通过提供的三个示例,您将看到在一个位置设置值并不会删除其他位置的值:
local.set('user.session.timeout', false);
local.set('user.name', {first:'john', last:'doe', mi:'c'});
local.set('user.PIN', 8675309);
所有这些值,虽然设置在不同的时间,只是更新或创建一个值,它们不会清除其他地方的任何预先存在的值。
【问题讨论】:
-
lodash 有一个叫做 set 的函数,这可能是你想要的 -> lodash.com/docs/4.17.10#set
-
我应该提到的是项目的所有者想要保持原样。我们的最后一位开发人员烧毁了一些桥梁,将大量插件塞入我们现在要替换的网站。但我会看一下 lodash 的源代码 :)
-
您可以更改对象,然后将对象保存在localStorage中
-
peek at the source code for lodash,.. 你当然可以这样做.. 我可以理解代码膨胀的问题,我认为 lodash 的开发人员理解这一点,这就是你可以挑选位的原因你只需要。假设你使用的是构建系统(ps。你应该是),你可以做require("lodash/set") -
您目前似乎在问的是从点符号字符串中遍历您的对象。然后它是stackoverflow.com/questions/6393943/… 的副本,但这听起来像一个糟糕的设计模式,我不明白为什么你不能将你的对象直接存储为 JSON。 (在页面加载时反序列化一次,仅在真正需要时序列化(例如在卸载时可能就足够了)
标签: javascript object local-storage