从包含数组的数组中删除重复项
我有这样的JSON数组
[{"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"}]
我想创建一个具有不同Groups
的新数组(用于选择标记)。
这个Groups
是一个数组。
我希望selectbox具有以下值:
MOD_SW MOD_PI MOD_GE
我的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 + ""); }); }
我也试过了
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
为null或不是对象
此代码附加select
标记组值,但它显示为重复,因为Groups
是一个数组。
我必须创建一个新的for
语句来浏览Groups
数组吗?
或者还有另一种方法可以避免嵌套for
语句?
谢谢
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( $('', { value: group, text: group }) ); } }); });
更新:
为了提高效率,您可以定义静态dtstinct
方法:
$.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( $('', { value: group, text: group }) ); });
首先看一下最后一组: "Groups":["MOD_PI,MOD_GE"]
你不需要在MOD_PI之后关闭引号并在逗号之后打开它们或者这是一组组吗?
如果这与引号有问题,您的脚本可能如下所示:
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; } } }
如果这是一组组:
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)检查重复项,而且你不需要做额外的工作(例如对任何数组进行排序)。