值赋值和返回变量在同一行中

时间:2013-02-08 11:52:55

标签: javascript

我有以下代码

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

3 个答案:

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