【问题标题】:jQuery Multidimensional Array remove DuplicatesjQuery多维数组删除重复项
【发布时间】:2016-11-04 14:45:28
【问题描述】:

我想用 jQuery 删除数组中的重复项

数组

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

如果此示例中的名称(“预算”)出现多次, 然后我想删除这个值对。

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

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

【问题讨论】:

  • 您确定data.items 是数组数组中的数组吗?看起来你的一对括号太多了。您能否提供console.log(JSON.stringify(data.items)) 的输出来确定这一点?
  • 是的,对不起,最后它再次被推入一个数组。因为jqplot(制作图表)需要那种数据格式

标签: jquery arrays multidimensional-array duplicates


【解决方案1】:

看看下面的例子。不能直接使用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/>");
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result"></div>

【讨论】:

  • 我知道这很古老,但很棒!
【解决方案2】:

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

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

等式的两边都表示数组,即使它们的内容可能相同,它们也不引用 same 数组。因此,除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。

【讨论】:

  • 谢谢你的详细解释! console.log(["Budget",1] == ["Budget",1]) 是返回 false 但我不明白为什么它适用于 (i = 0; i
  • 因为它引用了同一个数组?
  • 确实,它会为每个元素只工作一次,这就是循环获得等于prop_name 的值i 时:在这种情况下,您实际上是在比较 相同数组。请注意,比较绝不会查看数组内容。比较的是数组引用。当两者都引用相同的内存位置时,它们是相等的。
【解决方案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 可以从数组中删除元素。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2018-07-26
    • 2014-05-26
    • 2012-12-14
    • 2021-02-16
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多