2011-05-23 83 views
2

我有一個json數組,它有多個缺失的數字並且是無序的。找出缺失數字的最佳方法是什麼?我的第一個想法是迭代並按順序構造一個新的臨時數組(因此如果第一個鍵是50,它會到達arr [50]),然後找出哪些沒有鍵。不幸的是,這看起來非常低效。在對象數組中找到缺失的值

更新: 這裏有點我的JSON的:

 
"groups": [ 
    { 
     "group_id": "1", 
     "group_name": "AABYODAADAAAW6KAAA", 
    }, 
    { 
     "group_id": "5", 
     "group_name": "AABYODAADAAAW6KAAB", 
    }, 
    { 
     "group_id": "2", 
     "group_name": "AABYODAADAAAW6KAAC", 
    }, 
    { 
     "group_id": "3", 
     "group_name": "AABYODAADAAAW6KAAAD", 
    }, 
    { 
     "group_id": "6", 
     "group_name": "AABYODAADAAAW6KAAAE", 
    } 
]

,我整理group_id,但數組長度超過2000人。

+1

這是一個JS數組,JS對象,JSON數組或JSON對象? (提示:JSON是一個字符串。) – Phrogz 2011-05-23 20:30:26

+4

您可能想要接受一些以前的答案以獲得更多幫助。 – wajiw 2011-05-23 20:30:41

+1

@Progrog:一個JS數組仍然是一個JS對象。 ;)SortingHat:請閱讀http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/您是否有一段代碼向我們展示? – 2011-05-23 20:32:29

回答

6

假設這是你在談論(而不是JS數組或JSON數組或JSON對象)一個JS對象,你必須循環兩次:

var max; 
for (var key in obj) if (obj.hasOwnProperty(key) && (!max || key>max)) max = key; 
for (var i=0;i<=max;++i) if (obj[i]==undefined){ 
    console.log("Missing: "+i); 
} 

編輯:根據您更新的示例,看起來您有一組對象,其中的鍵是表示整數的字符串,並且您想要確定鍵可能會丟失。這裏的代碼將這樣做:

var groups = myObj.groups; 
var groupNames = []; 
for (var i=0,len=groups.length;i<len;++i){ 
    groupNames[groups[i].group_id] = groups[i].group_name; 
} 
for (i=0,len=groupNames.length;i<len;++i){ 
    var name = groupNames[i]; 
    if (name==undefined){ 
    console.log("Oops, no name for group_id: "+i); 
    }else{ 
    // Do what you want 
    } 
} 
+0

@SortingHat我已根據您的示例代碼更新了我的答案。 – Phrogz 2011-05-23 21:39:04

+0

你不必在本地聲明'i'和'len'兩次(第一個'var i ...'就足夠了)。 – 2011-05-24 11:41:05

+0

@Marcel好的一點,謝謝;肌肉記憶鍵入那些:) – Phrogz 2011-05-24 12:54:33

0

也許你可以用正確的順序構造一個數字的單獨數組,然後遍歷第一個數組,然後從第二個數組中刪除那些匹配的數組。按照順序,新陣列中剩下的應該是缺少的數字。