我正在验证数组元素是否具有重复值。我在数组中有多个对象,例如
{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
。
答案 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