2012-01-09 53 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