Eliminar duplicados de una matriz que contiene la matriz

Tengo una matriz JSON como esta

[{"Email":"someone@some.com","Name":"ACO","Groups":["MOD_SW","MOD_PI","MOD_GE"],"Id":63,"Url":"aco"}, {"Email":"someone@some.com","Name":"Agpo","Groups":["MOD_PI"],"Id":22,"Url":"agpo"}, {"Email":"someone@some.com","Name":"Akatherm","Groups":["MOD_SW"],"Id":64,"Url":"akatherm"}, {"Email":"someone@some.com","Name":"Albrand","Groups":["MOD_PI,"MOD_GE"],"Id":23,"Url":"albrand"}] 

Quiero crear una nueva matriz (para la etiqueta seleccionada) con Groups distintos.

Este Groups es una matriz.

Quiero que selectbox tenga los siguientes valores:

 MOD_SW MOD_PI MOD_GE 

Mi JS:

 UpdateSelectMenu: function (selectId, data) { $(selectId).empty(); $(selectId).html("All groups"); 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("" + v + ""); }); } 

Intenté también

 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]); } } 

Pero el error aparece como: Groups.length es nulo o no es un objeto

Este código se agrega para select etiquetar los valores del Grupo, pero aparece como duplicados porque Groups es una matriz.

¿Tengo que crear una nueva instrucción for para navegar por la matriz de Groups ?

¿O hay otra alternativa para evitar nesteds for declaraciones?

Gracias

2 bucles nesteds podrían hacer el trabajo:

 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"] 

y si desea agregar directamente opciones a su menú desplegable:

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

ACTUALIZAR:

Y para hacer esto más eficiente, podría definir un método dtstinct estático:

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

y luego usar el método .map :

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

Primero observe el último grupo: "Groups":["MOD_PI,MOD_GE"] ¿No necesita cerrar las comillas después de MOD_PI y abrirlas después de la coma o este es un conjunto de grupos?

Si esto con las comillas es un problema, su script puede verse así:

 var obj = [{"Email":"someone@some.com","Name":"ACO", "Groups":["MOD_SW","MOD_PI","MOD_GE"],"Id":63,"Url":"aco"}, {"Email":"someone@some.com","Name":"Agpo", "Groups":["MOD_PI"],"Id":22,"Url":"agpo"}, {"Email":"someone@some.com","Name":"Akatherm", "Groups":["MOD_SW"],"Id":64,"Url":"akatherm"}, {"Email":"someone@some.com","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; } } } 

Si este es un conjunto de grupos:

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

Creo que es la forma más eficiente porque está comprobando si hay duplicados con O (1) y no tiene que hacer trabajo adicional (por ejemplo, ordenar cualquier matriz).