2011-05-23 121 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

也许你可以用正确的顺序构造一个数字的单独数组,然后遍历第一个数组,然后从第二个数组中删除那些匹配的数组。按照顺序,新阵列中剩下的应该是缺少的数字。