2012-01-09 34 views
0

阵列删除重复我有一个JSON数组这样从含有阵列

[{"Email":"[email protected]","Name":"ACO","Groups":["MOD_SW","MOD_PI","MOD_GE"],"Id":63,"Url":"aco"}, 
{"Email":"[email protected]","Name":"Agpo","Groups":["MOD_PI"],"Id":22,"Url":"agpo"}, 
{"Email":"[email protected]","Name":"Akatherm","Groups":["MOD_SW"],"Id":64,"Url":"akatherm"}, 
{"Email":"[email protected]","Name":"Albrand","Groups":["MOD_PI,"MOD_GE"],"Id":23,"Url":"albrand"}] 

我想创建一个新的数组(选择标记)具有鲜明Groups

这个Groups是一个数组。

我想要的选择框有以下值:

MOD_SW 
MOD_PI 
MOD_GE 

我的JS:

UpdateSelectMenu: function (selectId, data) { 
     $(selectId).empty(); 
     $(selectId).html("<option value='all' selected='selected'>All groups</option>"); 
     var array_unique_values = []; 

     for (var i = 0; i < data.Groups.length; i++) { 
     for (var j = i+1; j < data.Groups.length; j++) { 
      if (data.Groups[i] === data.Groups[j]) { 
       j = ++i; 
      } 
     } 
     array_unique_values.push(data.Groups[i]); 
     } 

     array_unique_values = array_unique_values.sort(); 

     $.each(array_unique_values, function (k, v) { 
     $(selectId).append("<option value='" + v + "'>" + v + "</option>"); 
     }); 
    } 

我也试过

for (var i = 0; i < data.length; i++) { //browse whole data 
     for (var j = 0; j < data[i].Groups.length; j++) { //browse Groups array 
      for (var k = j + 1; j < data[i].Groups.length; k++) { 
       if (data[i].Groups[j] === data[i].Groups[k]) { 
        continue; 
       } 
      } 

      array_unique_values.push(data[i].Groups[j]); 
     } 
     } 

但由于出现错误:Groups.length为空或不是物体

此代码附加到select标记组值,但它显示为重复项,因为Groups是一个数组。

我必须创建一个新的for语句来浏览Groups数组?

或者还有另外一种方法避免嵌套for陈述?

谢谢

回答

3

2个嵌套循环可以做的工作:

var data = [... your data ...]; 
var groups = []; 
$.each(data, function(i, item) { 
    $.each(item.Groups, function(j, group) { 
     if ($.inArray(group, groups) == -1) { 
      groups.push(group); 
     } 
    });  
}); 

// at this stage groups = ["MOD_SW", "MOD_PI", "MOD_GE"] 

,如果你想直接附加选项,您的下拉列表:

var groups = []; 
$.each(data, function(i, item) { 
    $.each(item.Groups, function(j, group) { 
     if ($.inArray(group, groups) == -1) { 
      groups.push(group); 
      $(selectId).append(
       $('<option/>', { 
        value: group, 
        text: group 
       }) 
      ); 
     } 
    });  
}); 

UPDATE:

又使这个效率更高,你可以定义一个静态的方法:

$.extend({ 
    distinct : function(arr) { 
     var result = []; 
     $.each(arr, function(index, value) { 
      if ($.inArray(value, result) == -1) { 
       result.push(value); 
      } 
     }); 
     return result; 
    } 
}); 

,然后使用.map方法:

var data = [... your data ...]; 
var groups = $.distinct($(data).map(function() { 
    return this.Groups;  
})); 
$.each(groups, function(index, group) { 
    $(selectId).append(
     $('<option/>', { 
      value: group, 
      text: group 
     }) 
    ); 
}); 
+0

$ .inArray正在做一个循环(如果indexOf不可用),我认为效率很低。 – 2012-01-09 10:10:00

+0

所有尊重你Darin :)你救了我的命。这些'$ .each'没有通过我的大脑。 – 2012-01-09 10:11:41

+0

@mgechev,好点。我用更高效的替代方案更新了我的答案。 – 2012-01-09 10:20:33

2

在最后一组首先看看:"Groups":["MOD_PI,MOD_GE"] 你不需要逗号之后MOD_PI后关闭的报价并打开它们或这是一套班子?

如果用引号是问题的脚本可以是这个样子:

var obj = [{"Email":"[email protected]","Name":"ACO", "Groups":["MOD_SW","MOD_PI","MOD_GE"],"Id":63,"Url":"aco"}, 
{"Email":"[email protected]","Name":"Agpo", "Groups":["MOD_PI"],"Id":22,"Url":"agpo"}, 
{"Email":"[email protected]","Name":"Akatherm", "Groups":["MOD_SW"],"Id":64,"Url":"akatherm"}, 
{"Email":"[email protected]","Name":"Albrand", "Groups":["MOD_PI","MOD_GE"],"Id":23,"Url":"albrand"}] 

var temp = {}, 
    result = []; 

for (var i = 0; i < obj.length; i+=1) { 
    for (var j = 0; j < obj[i]['Groups'].length; j+=1) { 
     if (typeof temp[obj[i]['Groups'][j]] === 'undefined') { 
      result.push(obj[i]['Groups'][j]); 
      temp[obj[i]['Groups'][j]] = true; 
     } 
    } 
} 

如果这是一组集:

for (var i = 0; i < obj.length; i+=1) { 
    for (var j = 0; j < obj[i]['Groups'].length; j+=1) { 
     currentGroups = obj[i]['Groups'][j].split(','); 
     for (var k = 0; k < currentGroups.length; k += 1) { 
      currentGroups[k] = currentGroups[k].replace(/ /g,""); 
      if (typeof temp[currentGroups[k]] === 'undefined') { 
       result.push(currentGroups[k]); 
       temp[currentGroups[k]] = true; 
      }  
     } 
    } 
} 

我认为这是最有效的方式,因为你正在用O(1)检查重复项,你不必做额外的工作(例如排序任何数组)。

+0

我已经编辑。感谢您的关注 – 2012-01-09 10:02:29

+0

不客气。我已发布版本,您甚至可以检查一组组。我认为这会在两种情况下帮助你。问候! – 2012-01-09 10:03:56