1

次のコードがあります

var s = storage('foo');
s.bar = 100;
storage('foo', s);

storage一部のストレージ メディアからオブジェクトを返します。次に、オブジェクトの 1 つのプロパティの値を変更し、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'));
}

編集:したがって、ストレージ関数で次の1行の変更を行うことになりました。しかし、これは多次元の使用を考慮していません。だから私はどんな提案も歓迎します。

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]を使用して、(ほぼ) 1 行でこれを行う方法がありますが、きれいではありません。

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

オブジェクトを変更する関数を受け入れる関数を作成できます。

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 に答える
0

storageを返すのでobject、できる (非常に) 良い可能性があります*;

storage('foo').bar = 100;

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

...直接、オブジェクトは「参照渡し」風のようです。


* これが当てはまらない状況は、オブジェクト自体ではなく、格納されているオブジェクトのコピーstorageを返す場合です。したがって、返されたオブジェクトを更新しても、ストレージ内のオブジェクトには影響しません。

于 2013-02-08T11:56:34.040 に答える