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