1

キューを表すオブジェクトがあり、そこから最後の n 番目の要素を保持したい (固定サイズ)。

var m = {};
m["t1"] = {  a: "t1", b: "t1" };
m["t2"] = {  a: "t2", b: "t2" };

......
......
m["tn-1"] = {  a: "tn-1", b: "tn-1" };
m["tn"] = {  a: "tn", b: "tn" };

この例では、最後の N を保持し、残りを削除します。

簡単な解決策は何ですか?アンダースコア js で実行できますか?

@AlexK が気付いたように、「for..in オブジェクトの順序は、技術的には追加の順序と一致することが保証されていません。

編集:

私は1つの解決策を見つけました:

m2= {};

_.each(_.last(_.keys(m), size), function(key){
   m2[key] = m[key];
});

m= m2;

問題または問題は、これにメモリ リークがある場合、未使用のアイテムはどうなるかということです。

4

4 に答える 4

0

これは、名前のインデックス/キーを保持するが、真の配列を使用しない場合に必要な追加の順序を追跡する潜在的なネイティブな方法です。

trimToLast上位の項目を破棄し、残りの項目のインデックスを調整します。

キーとして使用aし、既存のアイテムをインプレースで同じ値に置き換えます。その後の追加は、オブジェクトの最後に表示されます。

function Q() {
    this.length = 0;
    this.items = {};
};
Q.prototype.add = function(a, b) {
    this.items[a] = {index: typeof this.items[a] === "undefined" ? this.length++ : this.items[a].index, a: a, b: b};
    return this;
}
Q.prototype.trimToLast = function(keepLast) {
    this.length -= keepLast;
    for (var i in this.items) {
        if (this.items[i].index < this.length) {
            delete this.items[i];
        } else {
           this.items[i].index -= this.length; 
        }
    }
    this.length = keepLast;
}

var q = new Q();
q.add("t1", "t1").add("t2", "t2");
q.add("t3", "t3");
q.add("t4", "t4");

q.trimToLast(2);

q.add("t5", "t5");

for (var i in q.items)
     console.log(i, ": #" + q.items[i].index + " of " + q.length, q.items[i]);   

為に

t3 : #0 of 3 Object {index: 0, a: "t3", b: "t3"} 
t4 : #1 of 3 Object {index: 1, a: "t4", b: "t4"}
t5 : #2 of 3 Object {index: 2, a: "t5", b: "t5"}
于 2013-04-26T13:59:41.663 に答える
0

1 つのアプローチを次に示します。

var keepTopFnBuilder = function(count, makeSortKey) {
    return function(obj) {
        var keys = _.sortBy(_.map(_.keys(obj), function(key) {
            return {key: key, sortKey: makeSortKey(key)};
        }), "sortKey");
        _.each(_.first(keys, Math.max(0, keys.length - count)), function(key) {
            delete obj[key.key];
        });
    };
};

var m = {};

var keepTop = keepTopFnBuilder(5, function(key) {return +key.substring(1);});

keepTop(m)が呼び出されるたびmに、プロパティ名の最初の文字の後に格納されている整数に基づいて、上位 5 つの要素を除くすべての要素が削除されます。

ここでのメイン関数は、インデックスをソート キーに変換する方法と保持するキーの数を選択できるという点で、やや汎用的です。新しい要素を追加するたびに(または、好きなだけ頻繁に)オブジェクトで呼び出すことができる関数を返します。

http://jsfiddle.net/CrossEye/4M3L4/で動作しているのを見ることができます

于 2013-04-26T13:36:16.577 に答える
0

まず、ネイティブsplice()メソッドを利用できるため、オブジェクトの代わりに配列を使用する方がはるかに簡単です。しかし、あなたの質問に答えるには:

delete m.t1;
delete m.t2;
于 2013-04-26T11:59:06.573 に答える