我需要找到s.data中与用户相比缺少哪些ID号。 是否有更好的(更小的代码)方式进行比较?
谢谢;)
if(users.length != undefined)
{
for(y=0;y<users.length;y++)
{
var left = true;
for(y2=0;y2<s.data.length;y2++)
{
if(users[y].client_id==s.data[y2].client_id) {left = false;break;}
}
if(left) {users[y].ref.remove();delete users[y];}
}
}
else if(!jQuery.isEmptyObject(users))
{
var left = true;
for(y2=0;y2<s.data.length;y2++)
{
if(users.client_id==s.data[y2].client_id) {left = false;break;}
}
if(left) {users.ref.remove();users = {};}
}
尚未检查这是否是正常工作的代码。 :)
答案 0 :(得分:4)
首先,关闭,第二个分支似乎只是第一个分支的专业化。您可以使用它来制作“第二个”users = [users]
(在这种情况下,用户真的意味着用户而不是用户)并且完全取消顶级分支,或者将逻辑删除到每个用户调用的函数。
现在,要解决内循环:这是'地图'和'包含'。仅仅根据一个包含来看待它:
// Returns true if any item in data.client_id (an array)
// is that of user.client_id
function dataContains (user, data) {
for (var i = 0; i < data.length; i++) {
if (data[i].client_id == user.client_id) {
return true
}
}
return false
}
现在代码缩减为:
for (each user) {
if (!dataContains(user, data)) {
// do something here
}
}
但是,如果我们还有一个“地图”,我们可以更进一步使用通用的“包含”。最后的形式是:
var dataIds = map(data, function (x) { return x.client_id })
for (each user) {
if (!contains(user.client_id, dataIds)) {
..
}
}
“包含”更加概括:
// Returns true iff item is contained within arr
function contains (item, arr) {
// Just do what the comment documentation says
}
如果您使用的是jQuery,那么您已经拥有了便利的功能: '包含' - inArray,以及“sorta”'地图' - map。但是,请注意! jQuery“map”实际上是一张平面图,名称不正确,文档不完整!
我相信ECMAScript ED5具有这些功能标准。
此外,您可以将数据中的client_id反转为对象键,并简单地测试密钥是否存在,即O(1)与O(n) iff 查找构建一次(或至少很多,比它的使用少得多)因此它可能在“理论上”更好。如果它实际上很重要,那么n的大小会产生很大的差异。在这种情况下,可能会逐步构建查找并在执行此代码之间保存。
var existingIds = {}
for (var i = 0; i < data.length; i++) {
existingIds[data[i].client_id] = true
}
for (each user) {
if (!existingIds[user.client_id]) {
..
}
}