2010-06-27 109 views
0

我需要找到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 = {};} 
} 

如果这是工作的代码还没有检查。 :)

+2

似乎没有做你说你需要的东西。而且,较短的代码并不意味着更好的代码。更低的时间复杂度或内存需求创建更好的代码 – defines 2010-06-27 15:19:11

+1

@Dustin Fineout更低*代码*复杂性通常意味着我的书中“更好”的代码......(除非存在已知的性能问题,我不在乎其他人:-) – 2010-06-27 15:28:46

+0

该死的我需要从用户那里获得client_id号码在s.data中不存在。或者我工作太久了,或者我很笨。 :D – Somebody 2010-06-27 15:48:11

回答

4

首先,关闭,第二个分支似乎只是第一个分支的专业化。您可以使用它来创建“2nd”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' - map。但是,请注意! jQuery的“地图”实际上是一张平面地图,并且被赋予不正确的名称和不完整的文档!

我相信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]) { 
    .. 
    } 
} 
+0

谢谢队友!这就是我称之为优秀的答案! 太糟糕了,我只能添加1个:) – Somebody 2010-06-27 16:59:20