我有以下代码
var s = storage('foo');
s.bar = 100;
storage('foo', s);
storage
从某些存储媒体返回一个对象。然后,我更改对象的一个属性的值,并再次将其发送到storage
。我的问题是,有没有办法让它成为一个班轮?像
storage('foo', storage('foo').bar = 100);
但上述代码只保存100
而不是整个foo
对象。
这是storage
函数,它存储在localstorage上但是使其成为对象存储而不是字符串存储:
function storage(item, value) {
if(value!=null) {
var result = (storage()) ? storage() : {};
if(item) result[item] = value;
return localStorage.setItem('storage', JSON.stringify(result))
} else return (item) ? storage()[item] : JSON.parse(localStorage.getItem('storage'));
}
编辑: 所以我最终在存储功能中进行了一次换行。但这并不能解释多维用法。所以我会欢迎任何建议。
function storage(item, value, property) {
...
if(item) (property) ? result[item][property] = value : result[item] = value;
...
}
答案 0 :(得分:2)
如果你不能改变storage
函数,合理的做法是创建另一个函数:
function set_storage(obj, prop, val) {
var s = storage(obj);
obj[prop] = val;
storage(obj, s);
}
// usage
set_storage('foo', 'bar', 100);
如果你可以改变存储,这将是一个更好的方法。 jQuery.data
的工作方式类似。
在[{3}}的帮助下,有几种方法可以在(几乎)一行中完成此操作,但它并不漂亮:
var s = storage('foo');
storage('foo', (s.bar = 100, s));
既然你说storage
是你的功能,那么重载似乎是一种好方法。它会是这样的:
function storage(key, prop, val) {
var storage = JSON.parse(localStorage.getItem('storage'));
if(arguments.length === 0) {
return storage;
}
else if (arguments.length === 1) {
// only one argument passed, return the value with key `key`
return storage[key];
}
else if (arguments.length === 2) {
// set `key` to `prop` (`prop` contains the actual value)
storage[key] = prop;
}
else {
// set property `prop` of object in `key` to value `val`
storage[key][prop] = val;
}
localStorage.setItem('storage', JSON.stringify(storage));
}
// Usage
// get `foo`:
var foo = storage('foo');
// set `foo`:
storage('foo', {bar: 42});
// set foo.bar
storage('foo', 'bar', 100);
我希望它会给你一些想法。
答案 1 :(得分:0)
当storage
返回object
时,你可以做到非常好的机会*;
storage('foo').bar = 100;
console.log(storage('foo').bar); // should give 100.
...直接,因为对象是“通过引用传递”-esque。
*不会出现这种情况的情况是storage
返回存储对象的副本,而不是对象本身;因此,您对返回的对象所做的任何更新都不会对存储中的对象产生影响。
答案 2 :(得分:0)
您可以创建一个接受更改对象的函数的函数:
function changeObject(key, func) {
var obj = storage(key);
func(obj);
storage(key, obj);
}
changeObject('foo', function (s) { s.bar = 100; });