我想用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;
}
}
答案 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);
对于小数据集,这是无关紧要的,但对于较大的数据集,需要考虑这一点。
删除元素:
否则,您必须在发现它们时删除*重复项。
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。