我有一个函数,如果其中有重复值,将检查序列化表单数据。
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'
]
]
有没有更好的方法来完成同样的任务?也许更短?
答案 0 :(得分:2)
var array = [
[ 'my_field1', 'val1' ],
[ 'my_field2', 'val2' ],
[ 'my_field3', 'val1' ],
[ 'my_field4', 'val2' ],
[ 'my_field5', 'val3' ]
], matches = [], match = false;
for(var i = 0, j = array.length; i < j; i++) {
match = false;
for(var k = 0, l = matches.length; k < l; k++) {
if(matches[k][1] == array[i][1]) {
match = true;
}
}
if(match) alert('Duplicate!');
else matches.push(array[i]);
}
答案 1 :(得分:1)
如果您使用典型格式序列化数据,例如:
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) || []
是匹配可以返回 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;
}
}
}
答案 2 :(得分:0)
试试这个,虽然它不会短得多:
var array = [
[
'my_field1',
'val1'
],
[
'my_field2',
'val2'
],
[
'my_field3',
'val1'
]
]
var originals = [];
var duplicates = [];
for (a in array) {
if (originals.indexOf(array[a][1] == -1)) {
originals.push(array[a][1])
} else {
duplicates.push(array[a])
}
}
alert('duplicates: ' + duplicates.join(', '));