Javascript 从没有循环的对象中删除某些特性

Javascript 从没有循环的对象中删除某些特性,javascript,jquery,object,Javascript,Jquery,Object,我正在试图找到从属性commentCount和likeCount都等于0的对象中删除属性的最有效方法。在下面的示例中,Activity.3将被删除。我不想用$循环它们。each(),因为这似乎需要更多的时间 Activity = { 0 : { 'commentCount' : 10, 'likeCount' : 20 }, 1 : { 'commentCount' : 0, 'likeCount' : 20 },

我正在试图找到从属性
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    
    }
}
更新


创造这个物体的环境受到了质疑。要澄清的是,
活动
对象内部最多可以有300万个属性。它作为AJAX JSON响应在服务器端生成,并保存到内存中。它不仅仅包括其他地方使用的
commentCount
likeCount
,因此我不能让服务器不响应
commentCount
likeCount

都为0的东西,啊,过早优化的味道^_^

你有多少这样的东西?你需要清洗多少个?如果答案是“少于100万”和“一次或很少”,那么可能就不值得麻烦了

如果您需要一种快速且最佳的方法,这里有一个想法:为属性创建一个新的数据结构和setter。每次设置它们时,检查它们是否都是
0
,并将它们放入“杀死”列表中

这样,您只需迭代kill列表

[编辑]对于数百万个对象和需要快速清理的对象,杀戮列表是一个不错的选择,尤其是在情况罕见(只有少数对象匹配)的情况下

只需编写一个更新这些属性的函数,并确保所有代码都通过它来更新它们。然后,您可以在那里管理杀死列表


或者,只要调用函数将这两个属性或第二个属性都设置为0,您就可以简单地删除对象。

啊,过早优化的味道^_^

你有多少这样的东西?你需要清洗多少个?如果答案是“少于100万”和“一次或很少”,那么可能就不值得麻烦了

如果您需要一种快速且最佳的方法,这里有一个想法:为属性创建一个新的数据结构和setter。每次设置它们时,检查它们是否都是
0
,并将它们放入“杀死”列表中

这样,您只需迭代kill列表

[编辑]对于数百万个对象和需要快速清理的对象,杀戮列表是一个不错的选择,尤其是在情况罕见(只有少数对象匹配)的情况下

只需编写一个更新这些属性的函数,并确保所有代码都通过它来更新它们。然后,您可以在那里管理杀死列表


或者,只要调用函数将这两个属性或第二个属性都设置为0,您就可以简单地删除对象。

这只是一个起点,但是像这样的事情怎么样?基本上,它根据活动的
likeCount
commentCount
之和将活动放入bucket中。它可以很容易地在没有喜欢或评论的情况下终止所有活动,但我认为这是一种权衡。我不确定你是如何插入这些东西并阅读它们的。所以,你必须决定这是否值得

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
}); 
编辑:
发布后,很明显,如果你以这种方式添加项目,如果他们没有喜欢或评论,你就不能添加。我的猜测是事情并没有那么简单,所以请提供一些关于如何添加和更新事情的细节

这只是一个起点,但是像这样的事情怎么样?基本上,它根据活动的
likeCount
commentCount
之和将活动放入bucket中。它可以很容易地在没有喜欢或评论的情况下终止所有活动,但我认为这是一种权衡。我不确定你是如何插入这些东西并阅读它们的。所以,你必须决定这是否值得

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
}); 
编辑:
发布后,很明显,如果你以这种方式添加项目,如果他们没有喜欢或评论,你就不能添加。我的猜测是事情并没有那么简单,所以请提供一些关于如何添加和更新事情的细节

我添加了第二个答案,因为这个解决方案来自完全不同的角度。在这个解决方案中,我试图找到最快的方法来删除不需要的条目。我不知道有没有任何不使用循环的方法可以做到这一点,但我可以想到几种使用jQuery和原始javascript使用循环的方法

并排显示所有测试用例

我将解释每个测试以及与每个测试相关的注意事项

  • 原始JS:最慢选项。看起来jQuery知道他们在用
    $做什么。每个
    $。映射
    循环

    var obj;
    for (var field in Activity) {
        if (Activity.hasOwnProperty(field)) {
            obj = Activity[field];
            if (obj.commentCount === 0 && obj.likeCount === 0) {
                delete Activity[field];
            }
        }
    }
    
  • $。每个
    :并列第二名。语法更清晰,比上面的原始js循环更快

    $.each(Activity, function(key, val){
        if (val.commentCount === 0 && val.likeCount === 0) {
            delete Activity[key];
        }
    });
    
  • $.map
    (对象版本):并列第二。警告:仅在jQuery>=1.6中支持

  • $.map
    (阵列版本):最快选项。警告:必须使用
    $.makeArray
    函数将对象转换为数组。我不确定这是否适合你的需要

  • 结论
    看起来像是
    $。如果首先使用
    $将对象转换为数组,则map
    最快。makeArray

    我添加了第二个答案,因为这个解决方案来自完全不同的角度。在这个解决方案中,我试图找到最快的方法来删除不需要的条目。我不知道有没有任何不使用循环的方法可以做到这一点,但我可以想到几种使用jQuery和原始javascript使用循环的方法

    并排显示所有测试用例

    我会解释每项测试和测试
    var arrActivity = $.makeArray(Activity);
    Activity = $.map(arrActivity, function(val, key){
        if (val.commentCount === 0 && val.likeCount === 0) {
            return null;
        }
    });