检查数组中的重复项

时间:2015-06-03 00:22:47

标签: 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;
    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'
    ]
]

有没有更好的方法来完成同样的任务?也许更短?

3 个答案:

答案 0 :(得分:2)

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