Javascript 检查数组中是否存在重复项
我有一个函数,它将检查序列化表单数据中是否有重复的值Javascript 检查数组中是否存在重复项,javascript,arrays,Javascript,Arrays,我有一个函数,它将检查序列化表单数据中是否有重复的值 s = $('#multiselectForm').serialize(); var x = []; var y = []; x = s.split("&"); for (var i = x.length - 1; i >= 0; i--) { y.push(x[i].split("=")); }; var c = 0; var e = 0;
s = $('#multiselectForm').serialize();
var x = [];
var y = [];
x = s.split("&");
for (var i = x.length - 1; i >= 0; i--) {
y.push(x[i].split("="));
};
var c = 0;
var e = 0;
for (var i = y.length - 1; i >= 0; i--) {
if (y[i][1] == y[c][1]) {
e++;
$('.duplicateAlert').show();
} else {
$('.duplicateAlert').hide();
};
c++;
};
基本上,它所做的是分割serialize()
函数生成的字符串,并将数据推送到数组中
我试图解析的数组如下所示:
Array [
Array [
0: 'my_field1',
1: 'val1'
],
Array [
0: 'my_field2'
1: 'val2'
],
Array [
0: 'my_field3'
1: 'val1'
]
]
有没有更好的方法来完成同样的任务?也许更短
var数组=[
['my_field1'、'val1'],
['my_field2'、'val2'],
['my_field3'、'val1'],
['my_field4'、'val2'],
['my_field5'、'val3']
],matches=[],match=false;
对于(var i=0,j=array.length;i
var数组=[
['my_field1'、'val1'],
['my_field2'、'val2'],
['my_field3'、'val1'],
['my_field4'、'val2'],
['my_field5'、'val3']
],matches=[],match=false;
对于(var i=0,j=array.length;i
var数组=[
['my_field1'、'val1'],
['my_field2'、'val2'],
['my_field3'、'val1'],
['my_field4'、'val2'],
['my_field5'、'val3']
],matches=[],match=false;
对于(var i=0,j=array.length;i
var数组=[
['my_field1'、'val1'],
['my_field2'、'val2'],
['my_field3'、'val1'],
['my_field4'、'val2'],
['my_field5'、'val3']
],matches=[],match=false;
对于(var i=0,j=array.length;i
如果您有典型格式的序列化数据,如:
var data = 'foo=foo&bar=bar%26bar&blah=foo';
然后,您可以通过获取=
和&
之间的值并查找重复项来检查重复项:
var seen = {};
var hasDupes = (data.match(/=[^&]+/g) || []).some(function(v){
return v in seen || (seen[v] = true) && false;
});
console.log(hasDupes); // true
背后的想法:
data.match(/=[^&]+/g) || []
如果找不到匹配项,则match可以返回null,因此如果出现这种情况,表达式将返回空数组,并在空数组上调用以下对some的调用(并返回false),而不是null,因此不会抛出否则会出现的错误
但是,我仍然认为在序列化之前直接检查表单控件值比序列化表单然后检查结果更有效
您可以使用以下函数来完成此操作:
function checkDupValues(form) {
var value,
seen = {},
controls = form.elements;
for (var i=0, iLen=controls.length; i<iLen; i++) {
// Might want to check type of control here and ignore buttons, etc.
value = controls[i].value;
// Ignore empty controls?
if (value != '' && value in seen) {
// have a duplicate value that is not ''
alert('have dupes');
} else {
seen[value] = true;
}
}
}
函数检查值(表单){
var值,
seen={},
控件=form.elements;
对于(var i=0,iLen=controls.length;i,如果您具有以下典型格式的序列化数据:
var data = 'foo=foo&bar=bar%26bar&blah=foo';
然后,您可以通过获取=
和&
之间的值并查找重复项来检查重复项:
var seen = {};
var hasDupes = (data.match(/=[^&]+/g) || []).some(function(v){
return v in seen || (seen[v] = true) && false;
});
console.log(hasDupes); // true
背后的想法:
data.match(/=[^&]+/g) || []
如果找不到匹配项,则match可以返回null,因此如果出现这种情况,表达式将返回空数组,并在空数组上调用以下对some的调用(并返回false),而不是null,因此不会抛出否则会出现的错误
但是,我仍然认为在序列化之前直接检查表单控件值比序列化表单然后检查结果更有效
您可以使用以下函数来完成此操作:
function checkDupValues(form) {
var value,
seen = {},
controls = form.elements;
for (var i=0, iLen=controls.length; i<iLen; i++) {
// Might want to check type of control here and ignore buttons, etc.
value = controls[i].value;
// Ignore empty controls?
if (value != '' && value in seen) {
// have a duplicate value that is not ''
alert('have dupes');
} else {
seen[value] = true;
}
}
}
函数检查值(表单){
var值,
seen={},
控件=form.elements;
对于(var i=0,iLen=controls.length;i,如果您具有以下典型格式的序列化数据:
var data = 'foo=foo&bar=bar%26bar&blah=foo';
然后,您可以通过获取=
和&
之间的值并查找重复项来检查重复项:
var seen = {};
var hasDupes = (data.match(/=[^&]+/g) || []).some(function(v){
return v in seen || (seen[v] = true) && false;
});
console.log(hasDupes); // true
背后的想法:
data.match(/=[^&]+/g) || []
如果找不到匹配项,则match可以返回null,因此如果出现这种情况,表达式将返回空数组,并在空数组上调用以下对some的调用(并返回false),而不是null,因此不会抛出否则会出现的错误
然而,我仍然认为检查t更有效