1

我有以下代码

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;
    ...
}
4

3 回答 3

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工作原理类似。

在逗号运算符[MDN]的帮助下,有很多方法可以在(几乎)一行中做到这一点,但它并不漂亮:

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

我希望它能给你一些想法。

于 2013-02-08T11:57:09.040 回答
0

作为storage回报object,你有一个(非常)好的机会*;

storage('foo').bar = 100;

console.log(storage('foo').bar); // should give 100.

...直接,因为对象是“通过引用传递”-esque。


* 如果不是这种情况,则storage返回存储的对象的副本,而不是对象本身;因此,您对返回对象所做的任何更新都不会影响存储中的对象。

于 2013-02-08T11:56:34.040 回答
0

您可以创建一个接受更改对象的函数的函数:

function changeObject(key, func) {
    var obj = storage(key);
    func(obj);
    storage(key, obj);
}

changeObject('foo', function (s) { s.bar = 100; });
于 2013-02-08T11:57:33.997 回答