按元素从数组中查找第一个重复值

时间:2018-10-04 10:18:54

标签: javascript arrays angularjs typescript ecmascript-6

  

我正在验证数组元素是否具有重复值。我在数组中有多个对象,例如{S:1,R:2,V:3}。我想针对该数组中“ S”元素的值是否重复发出警报消息。

我做了什么:

var arr=[{S:1,R:2,V:3},{S:2,R:2,V:3},{S:1,R:4,V:5},{S:3,R:2,V:3}, 
         {S:2,R:2,V:3},{S:3,R:4,V:5}];
function duplicateValidation()
{
var sorted_arr = arr.slice().sort();
var results = [];
for (var i = 0; i < sorted_arr.length - 1; i++) {
    if (sorted_arr[i + 1].S == sorted_arr[i].S) {
        results.push(sorted_arr[i]);
         break;
    }
}

   console.log(results);
   return results;
}

if(duplicateValidation().length==1)
{
alert("S -" + duplicateValidation()[0].S +" is duplicate");
}

但是上面的代码段(from this answer)对我不起作用。我期望警告消息中的S - 1 is duplicate

2 个答案:

答案 0 :(得分:1)

为此更改您的for,您的任务可以使用嵌套for而不是for循环来实现

var arr=[{S:1,R:2,V:3},{S:2,R:2,V:3},{S:1,R:4,V:5},{S:3,R:2,V:3}, 
         {S:2,R:2,V:3},{S:3,R:4,V:5}];
function duplicateValidation()
{
    var sorted_arr = arr.slice().sort();
    var results = [];
    for (var i = 0; i < sorted_arr.length - 1; i++) {
    var S_type = sorted_arr[i].S;
    for (var j = i; j < sorted_arr.length - 1; j++){
        if (sorted_arr[j + 1].S == S_type) {
            results.push(sorted_arr[i]);
            break;
        }
    }
 }       
   return results;
}

if(duplicateValidation().length > 1)
{
console.log("S - " + duplicateValidation()[0].S +" is duplicate");
}

答案 1 :(得分:0)

您不需要对数组进行排序-所做的只是对内容进行另一轮迭代-只需执行一次即可,并且您可以检查重复项而无需排序。

通过遍历数组并找到“ S”的每个项目值,然后检查  是否已将其推送到结果数组中-如果已推送,则将重复项的索引推送到重复数组中。然后,如果有重复项,您就会知道每个重复项的索引。

var arr=[{S:1,R:2,V:3},{S:2,R:2,V:3},{S:1,R:4,V:5},{S:3,R:2,V:3}, 
         {S:2,R:2,V:3},{S:3,R:4,V:5}];

var results = [];
var duplicates = [];
arr.forEach(function(obj, index){
  results.indexOf(obj.S) == -1
  ? results.push(obj.S)
  : duplicates.push(index)
})

var duplicatesLength = duplicates.length;
duplicates.length > 0
 ? console.log(duplicatesLength + ' duplicates found at index (' + duplicates .join(', ')+')')
 : console.log('No duplicates found')

//gives 3 duplicates found at index (2, 4, 5)
// ie: item 0 = item 2, item 1 = item 4, item 3 =  item 5