Javascript 将多个字段值一起比较

Javascript 将多个字段值一起比较,javascript,jquery,Javascript,Jquery,如何使用jQuery比较多个输入字段值以及是否存在匹配警报“存在相似值” <input value="111"> //similar <input value="222"> <input value="111"> //similar <input value="333"> //类似 //相似的 上面的html代码应该提醒“有相似的值”,因为它有两个相同的值。如何使用jQuery实现这一点 我尝试过(以下代码无效): 演示: $('input')

如何使用jQuery比较多个输入字段值以及是否存在匹配警报“存在相似值”

<input value="111"> //similar
<input value="222">
<input value="111"> //similar
<input value="333">
//类似
//相似的
上面的html代码应该提醒“有相似的值”,因为它有两个相同的值。如何使用jQuery实现这一点

我尝试过(以下代码无效):

演示:

$('input')。每个(函数(){
var$this=$(this);
var val=$this.val();
推力(val);
});
对于(变量i=0;i
您尚未将
VAL
定义为数组。你可以这样定义它

vals = [];

您尚未将
vals
定义为数组。你可以这样定义它

vals = [];

您的代码正常工作,您只是缺少了
vals
array-

的声明。您的代码正常工作,您只是缺少
vals
array-

var inputs=$(“input”)的声明,类似=[],i,j;
对于(i=0;i0){
警报(“存在类似值”);
}​
请注意,这只会按顺序比较唯一排列,如果您感兴趣,它会在类似数组中为您提供一个匹配索引数组

示例:

您可以使用document.getElementsByTagName而不是jQuery选择器轻松地删除jQuery依赖项

既然@Raynos不识字,我就把它说清楚

var inputs = document.getElementsByTagName("input"), similar = [], i, j;

for (i = 0; i < inputs.length; i += 1) {
    for (j = i + 1; j < inputs.length; j += 1) {
        if (inputs[i].value === inputs[j].value) {
            similar.push([i,j]);
        }
    }
}

if (similar.length > 0) {
    alert('There are similar values');
}​
var inputs=document.getElementsByTagName(“输入”),类似=[],i,j;
对于(i=0;i0){
警报(“存在类似值”);
}​
var输入=$(“输入”),类似=[],i,j;
对于(i=0;i0){
警报(“存在类似值”);
}​
请注意,这只会按顺序比较唯一排列,如果您感兴趣,它会在类似数组中为您提供一个匹配索引数组

示例:

您可以使用document.getElementsByTagName而不是jQuery选择器轻松地删除jQuery依赖项

既然@Raynos不识字,我就把它说清楚

var inputs = document.getElementsByTagName("input"), similar = [], i, j;

for (i = 0; i < inputs.length; i += 1) {
    for (j = i + 1; j < inputs.length; j += 1) {
        if (inputs[i].value === inputs[j].value) {
            similar.push([i,j]);
        }
    }
}

if (similar.length > 0) {
    alert('There are similar values');
}​
var inputs=document.getElementsByTagName(“输入”),类似=[],i,j;
对于(i=0;i0){
警报(“存在类似值”);
}​

编辑:为了满足@Raynos的要求,这里有一个纯JS解决方案

var vals = {};
var flag = false;
var collection = document.getElementsByTagName('input');
collection = [].slice.call(collection);

collection.forEach(function(element, index, array) {
    if (flag === true) return;
    var i = element.value;
    if (vals[i])
    {
        flag = true;
        alert('There are duplicates!');
    }
    else
    { 
        vals[i] = 1;
    }
});


奖励:我通过jsperf运行了我的解决方案;最后一个是

编辑:以下是解决问题的jQuery方法()。我最初的答案仍在下面

var duplicatefound = false;
$('input').each(function(index, item){
    if (duplicatefound) return;
    val = $(item).val();
    if ($('input[value="' + val + '"]').length == 1) return;
    duplicatefound = true;
    alert('There are similar values');
});
​ 在需要捕获部分或全部重复值时的替代解决方案()

var collection = $('input');
var duplicates = $.map(collection, function(item){
    val = $(item).val();
    return ($('input[value="' + val + '"]').length > 1) ? val : null;
});

if(duplicates.length > 0) alert('There are similar values');

正如其他人所提到的,您缺少作为数组的
vals
声明,因此,
.push()
失败

您可能会发现基于对象的解决方案更加优雅:

var vals = {};

$('input').each(function() {
    var index = $(this).val();
    if (vals[index])
    {
        vals[index]++
    }
    else
    { 
        vals[index] = 1;
    }
});

var duplicates = $.map(vals, function(val, key){
    return (val > 1) ? key : null;
});

if (duplicates.length > 0) alert('There are duplicates!');

编辑:为了满足@Raynos的要求,这里有一个纯JS解决方案

var vals = {};
var flag = false;
var collection = document.getElementsByTagName('input');
collection = [].slice.call(collection);

collection.forEach(function(element, index, array) {
    if (flag === true) return;
    var i = element.value;
    if (vals[i])
    {
        flag = true;
        alert('There are duplicates!');
    }
    else
    { 
        vals[i] = 1;
    }
});


奖励:我通过jsperf运行了我的解决方案;最后一个是

编辑:以下是解决问题的jQuery方法()。我最初的答案仍在下面

var duplicatefound = false;
$('input').each(function(index, item){
    if (duplicatefound) return;
    val = $(item).val();
    if ($('input[value="' + val + '"]').length == 1) return;
    duplicatefound = true;
    alert('There are similar values');
});
​ 在需要捕获部分或全部重复值时的替代解决方案()

var collection = $('input');
var duplicates = $.map(collection, function(item){
    val = $(item).val();
    return ($('input[value="' + val + '"]').length > 1) ? val : null;
});

if(duplicates.length > 0) alert('There are similar values');

正如其他人所提到的,您缺少作为数组的
vals
声明,因此,
.push()
失败

您可能会发现基于对象的解决方案更加优雅:

var vals = {};

$('input').each(function() {
    var index = $(this).val();
    if (vals[index])
    {
        vals[index]++
    }
    else
    { 
        vals[index] = 1;
    }
});

var duplicates = $.map(vals, function(val, key){
    return (val > 1) ? key : null;
});

if (duplicates.length > 0) alert('There are duplicates!');

我并不想比教皇更神圣,但a)你在迭代每个输入,在每次迭代中将
vals
重新定义为一个空数组b)你在每次迭代中检查匹配项,这效率很低。@vzwick是的,你是对的。我不知道我是怎么想的。我并不想比教皇更神圣,但a)你在迭代每个输入,在每次迭代时将
vals
重新定义为一个空数组b)你在每次迭代中检查匹配项,这效率不高。@vzwick是的,你是对的。不知道我是怎么想的。对于
循环使用或替代嵌套的
。对于
循环使用或替代嵌套的
。尝试在只有一个副本的集合上运行此操作,更不用说多个副本;)由于过度迭代,会出现大量警报。如果存在任何重复项,则应设置一个标志,如果该标志为
true
,则应在第一个
早期返回每个
:尝试在只有一个重复项的集合上运行此功能,更不用说多个重复项;)由于过度迭代,会出现大量警报。如果存在任何重复项,则应设置一个标志,如果该标志为
true
,则应在第一个
的早期
return
:与jQuery结合使用的短语“最快的”值得投下一票。最快的解决方案是始终不使用jQuery@Ra