在对象数组中查找缺失值

时间:2011-05-23 20:28:12

标签: javascript sorting

我有一个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,但数组长度超过2,000。

2 个答案:

答案 0 :(得分:6)

假设这是一个你正在讨论的JS对象(而不是JS数组或JSON数组或JSON对象),你必须循环两次:

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
  }
}

答案 1 :(得分:0)

也许你可以用正确的顺序构造一个单独的数组,然后遍历第一个数组并让它从匹配的secod数组中删除。新数组中剩下的内容应该是缺失的数字,按顺序排列。