2010-06-27 53 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