0

commentCountとのプロパティlikeCountが両方とも 0 に等しいオブジェクトからプロパティを削除する最も効率的な方法を見つけようとしています。次の例でActivity.3は、 が削除されます。$.each()必要以上に時間がかかるように思われるので、それらをループしたくありません。

Activity = {
    0 : {
    'commentCount' : 10,
    'likeCount' : 20    
    },
    1 : {
    'commentCount' : 0,
    'likeCount' : 20    
    },
    2 : {
    'commentCount' : 10,
    'likeCount' : 0    
    },
    3 : {
    'commentCount' : 0,
    'likeCount' : 0    
    }
}

アップデート

このオブジェクトの作成の状況が疑問視されています。明確にするために、Activityオブジェクトは内部に最大 300 万のプロパティを持つことができます。メモリに保存される AJAX JSON 応答としてサーバー側で生成されます。それには、他の場所で使用されているcommentCountと以外のものが含まれているため、とlikeCountの両方が 0 のものでサーバーが応答しないようにすることはできません。commentCountlikeCount

4

3 に答える 3

4

ああ、時期尚早の最適化の匂い^ _ ^

これらのオブジェクトはいくつありますか?それらをきれいにするためにいくつ必要ですか?答えが「100万未満」および「1回またはめったにない」である場合、おそらく気にする価値はありません。

迅速で最適な方法が必要な場合は、次のアイデアがあります。プロパティの新しいデータ構造とセッターを作成します。それらが設定されるたびに、それらが両方であるかどうかを確認0し、それらを「キル」リストに入れます。

そうすれば、キルリストを繰り返す必要があります。

[編集]数百万のオブジェクトがあり、迅速なクリーンアップが必要な場合、特に条件がまれな場合(ほんの数個のオブジェクトが一致する場合)、キルリストが最適です。

これらのプロパティを更新する関数を記述し、すべてのコードがそれらを更新するためにそれを通過することを確認してください。次に、そこでキルリストを管理できます。

または、関数が呼び出されたらすぐにオブジェクトを削除して、両方または2番目のプロパティを0に設定することもできます。

于 2012-06-19T18:46:26.497 に答える
0

これはほんの出発点ですが、このようなものはどうでしょうか?likeCount基本的に、との合計に基づいてアクティビティをバケットに入れcommentCountます。いいねやコメントなしですべてのアクティビティを簡単に終了できますが、トレードオフがあると思います。これらのものをどのように挿入して読んでいるのかわかりません。したがって、これが価値があるかどうかを判断する必要があります。

var ActivityMgr = function(){
    if(!(this instanceof ActivityMgr)){
        return new ActivityMgr();
    }

    this.activities = {};
};

ActivityMgr.prototype.add = function(activity){
    var bucket = parseInt(activity.commentCount, 10) + parseInt(activity.likeCount, 10);

    if (this.activities[bucket] === undefined) {
        this.activities[bucket] = [activity];
    }
    else {
        this.activities[bucket].push(activity);
    }

    this.cleanse();
};

ActivityMgr.prototype.cleanse = function(){
    this.activities[0] = [];
};

//Usage:
var activityMgr = new ActivityMgr();
activityMgr.add({
    likeCount: 0,
    commentCount: 10
}); 

編集: これを投稿した後、この方法でアイテムを追加している場合、いいねやコメントがない場合は追加できないことが非常に明らかになります. 物事はそれほど単純ではないと思うので、物事がどのように追加され、更新されるかについて詳細を提供してください.

于 2012-06-19T19:13:01.143 に答える
0

このソリューションはまったく別の角度からのものであるため、2 つ目の回答を追加します。このソリューションでは、不要なエントリを削除する最速の方法を見つけようとしています。ループなしでこれを行う方法はわかりませんが、生のjavascriptだけでなくjQueryを使用してループで行う方法はいくつか考えられます。

この jsperfは、すべてのテスト ケースを並べて表示します。

各テストと、それぞれに関連する注意事項について説明します。

  1. Raw JS:最も遅いオプション。jQuery は、ループ$.each$.mapループで何をしているかを認識しているようです。

    var obj;
    for (var field in Activity) {
        if (Activity.hasOwnProperty(field)) {
            obj = Activity[field];
            if (obj.commentCount === 0 && obj.likeCount === 0) {
                delete Activity[field];
            }
        }
    }
    
  2. $.each:2位タイ。上記の生の js ループよりも構文が簡潔で高速です。

    $.each(Activity, function(key, val){
        if (val.commentCount === 0 && val.likeCount === 0) {
            delete Activity[key];
        }
    });
    
  3. $.map(オブジェクトバージョン): 2 位タイ。警告: jQuery >= 1.6 でのみサポートされています。

    Activity = $.map(Activity, function(val, key){
        if (val.commentCount === 0 && val.likeCount === 0) {
            return null;
        }
    });
    
  4. $.map(アレイ バージョン): 最速のオプション。警告:$.makeArray関数を使用して、オブジェクトを配列に変換する必要があります。これがあなたのニーズに合っているかどうかはわかりません。

    var arrActivity = $.makeArray(Activity);
    Activity = $.map(arrActivity, function(val, key){
        if (val.commentCount === 0 && val.likeCount === 0) {
            return null;
        }
    });
    

結論first$.mapを使用してオブジェクトを配列に変換すると、最速の ように見えます。$.makeArray

于 2012-06-19T23:06:06.803 に答える