jQuery Multidimensional Array删除重复项

时间:2016-07-02 08:24:23

标签: jquery arrays multidimensional-array duplicates

我想用jQuery

删除数组中的重复项

数组

[[["Time",0],["Budget",1],["Scope",2],["Technical",3],["Budget",1]]]

如果此示例中有一个名称(" Budget")多次出现, 然后我想删除这个值对。

我尝试了很多但到目前为止没有任何效果。 我试图通过数组迭代并设置一个重复的变量,然后添加 没有重复项的新项目

  var items       = new Array ();
// get the data with ajax request
 $.ajax({
                url : "localhost/..",
                dataType : 'json',
                success: function(data) {

for (var prop_name in data.items) {
                    var duplicate = 0;
                    var count = 0;

// count how often the value appears
for (i = 0; i < data.items.length; i++) {
                    if (data.items[prop_name] == data.items[i]){
                        var count = count+1               
                        }
                }
// if there are duplicates, just add the value once
for (i = 0; i < items.length; i++) {    
                if (data.items[prop_name] == data.items[i]){
                duplicate = duplicate+1;
                    }
                if (duplicate <= 1){
                        items.push([ data.items[prop_name], count]) 
                    }
                duplicate = 0;
            }
}

3 个答案:

答案 0 :(得分:3)

看一下下面的例子。您无法直接使用vm.titulo = { id: $stateParams.id }; indexOf

$.inArray
$ar=[["Time",0],["Budget",1],["Scope",2],["Technical",3],["Budget",1]];
$finalAr = [];
for($i=0;$i<$ar.length;$i++){
	$currentPair = $ar[$i];
  $pos = null;
  for($j=0;$j<$finalAr.length;$j++){
  	if($finalAr[$j][0] == $currentPair[0] &&$finalAr[$j][1] == $currentPair[1]){
    	$pos = $j;
    }
  }
  if($pos == null){
  	$finalAr.push($currentPair);
  }
}
for($i=0;$i<$finalAr.length;$i++){
  $("#result").append($finalAr[$i][0]+"-->"+$finalAr[$i][1]+"<br/>");
}

答案 1 :(得分:3)

jQuery不是此任务所必需的。另请注意,创建新数组与从现有数组中删除元素不同。

创建新阵列:
以前迭代的“密钥”的简单记录可以防止复制重复。

使用ES5 Array.prototype.filter使这成为一项微不足道的任务:

var data = [["abc", 1], ["def", 2], ["ghi", 3], ["abc", 4], ["jkl", 5]];
var prev = {};

var filteredData = data.filter( function(arr) {

  var key = arr[0];

  if (prev[key])
    return false;

  return (prev[key] = true);
});

console.log(filteredData);
注意:算法总是存在时间与空间的关系。对于每个数组项,此哈希查找与 1 时间单位相比,嵌套循环的 n 时间单位(数组的每个元素)。哈希存储占用内存,而循环则不占用。

对于小数据集,这是无关紧要的,但对于较大的数据集,需要考虑这一点。

删除元素:
否则,您必须在发现它们时删除*重复项。

Array.prototype.splice可以从数组中删除元素。

*可能遇到一些性能问题,但如果在客户端管理数据,那么无论如何都要处理更大的问题。

答案 2 :(得分:1)

您的代码中的问题是您比较这样的数组:

 data.items[prop_name] == data.items[i]

等式的两边都代表数组,即使它们的内容可能相同,它们也不会引用相同的数组。因此除了prop_name === i时,所有元素的等式都将失败,导致所有元素的计数为1。

为了说明,这将输出false

console.log(["Budget",1] == ["Budget",1]);

此外,您的阵列嵌套的算法比您在算法中所占的要深,因此您需要在主循环中解决data.items[0]

我建议使用数组函数来实现你想要实现的目标,并使用临时对象来记录每个字符串的计数,这样你就不必在循环中循环。

您可以使用filter,并提供thisArg参数,以便我们可以使用this对象来保存遇到的名称的数量:

var items = [data.items[0].filter(function (pair) {
    return (this[pair[0]] = (this[pair[0]] || 0) + 1) === 1;
}, {})];

var data = {};
data.items = [[["Time",0],["Budget",1],["Scope",2],["Technical",3],["Budget",1]]];

var items = [data.items[0].filter(function (pair) {
    return (this[pair[0]] = (this[pair[0]] || 0) + 1) === 1;
}, {})];

console.log('before: ', data.items);
console.log('after: ', items);

此代码仅比较对的字符串部分。如果有可能有这样的数组:

[[["Time",0],["Time",1]]];

...然后上面的解决方案将消除第二对。但是如果你想保持以防数字部分不同,那么你需要进一步调整代码:

var items = [data.items[0].filter(function (pair) {
    return (this[pair[0]+pair[1]] = (this[pair[0]+pair[1]] || 0) + 1) === 1;
}, {})];

注意:你真的不需要jQuery。