Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查数组中是否存在重复项_Javascript_Arrays - Fatal编程技术网

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'
    ]
]
有没有更好的方法来完成同样的任务?也许更短

  • 创建一个空数组来保存匹配项
  • 在数组中循环。在每次迭代中。。。
  • 循环遍历matches数组并检查是否存在具有相同值的项。如果是,则设置匹配的标志
  • 检查是否已设置匹配的标志
  • 如果是,请提醒用户
  • 如果没有,则将该项添加到匹配项中

  • 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
  • 创建一个空数组来保存匹配项
  • 在数组中循环。在每次迭代中。。。
  • 循环遍历matches数组并检查是否存在具有相同值的项。如果是,则设置匹配的标志
  • 检查是否已设置匹配的标志
  • 如果是,请提醒用户
  • 如果没有,则将该项添加到匹配项中

  • 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
  • 创建一个空数组来保存匹配项
  • 在数组中循环。在每次迭代中。。。
  • 循环遍历matches数组并检查是否存在具有相同值的项。如果是,则设置匹配的标志
  • 检查是否已设置匹配的标志
  • 如果是,请提醒用户
  • 如果没有,则将该项添加到匹配项中

  • 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
  • 创建一个空数组来保存匹配项
  • 在数组中循环。在每次迭代中。。。
  • 循环遍历matches数组并检查是否存在具有相同值的项。如果是,则设置匹配的标志
  • 检查是否已设置匹配的标志
  • 如果是,请提醒用户
  • 如果没有,则将该项添加到匹配项中

  • 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更有效