編集: @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;
}
});
</p>
おまけ: jsperf を使用してソリューションを実行しました。最後のものは明らかに断然最速です。
編集:おそらくあなたの問題を解決するjQueryの方法は次のとおりです(Working fiddle here)。私の元の答えは以下のままです。
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()
失敗していました。
オブジェクトベースのソリューションがよりエレガントであることに気付くかもしれません: Working fiddle
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!');