首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jQuery:搜索多个相同的值

jQuery:搜索多个相同的值
EN

Stack Overflow用户
提问于 2015-05-10 12:04:06
回答 2查看 557关注 0票数 1
代码语言:javascript
复制
HTML:
<div class="sudoku">
    <div class="tr tr-1">
        <div class="td col-1 block-1"><input type="number" min="1" max="9"></div>
        <div class="td col-2 block-1"><input type="number" min="1" max="9"></div>
        <div class="td col-3 block-1"><input type="number" min="1" max="9"></div>
        ...
        <div class="td col-9 block-3"><input type="number" min="1" max="9"></div>
    </div>
    <div class="tr tr-2">
        <div class="td col-1 block-1"><input type="number" min="1" max="9"></div>
        <div class="td col-2 block-1"><input type="number" min="1" max="9"></div>
        <div class="td col-3 block-1"><input type="number" min="1" max="9"></div>
        ...
        <div class="td col-9 block-3"><input type="number" min="1" max="9"></div>
    </div>
    <div class="tr tr-3">
        <div class="td col-1 block-1"><input type="number" min="1" max="9"></div>
        <div class="td col-2 block-1"><input type="number" min="1" max="9"></div>
        <div class="td col-3 block-1"><input type="number" min="1" max="9"></div>
        ...
        <div class="td col-9 block-3"><input type="number" min="1" max="9"></div>
    </div>
    <div class="tr tr-4">
    ...
    </div>
...
</div>
代码语言:javascript
复制
JS:
$('.sudoku input').change(function() {
    $('.sudoku input').each( function(index,value) {
        console.log('#' + index + ': ' + $(this).val() );
    });
});

我有一个9x9 =81个输入字段(Sudoku)的表。我希望搜索/迭代所有这些字段,并检查任何块、行或列中的两个(或更多)输入字段是否相同,然后用.addClass()标记重复的输入字段,并将错误消息附加到'div.message‘。JS是我获得所有值的方法。我尝试过使用.length of '.sudoku inputvalue=#‘的多种方法,到目前为止,这些方法都没有起作用。你能帮我吗?

EN

回答 2

Stack Overflow用户

发布于 2015-05-10 12:16:17

我将首先为我添加几个数据属性,以便轻松地识别进行编辑的行和列:

代码语言:javascript
复制
<div class="sudoku">
    <div class="tr tr-1" data-row="1">
        <div class="td col-1 block-1" data-column="1">...</div>
        <div class="td col-2 block-1" data-column="2">...</div>
        <div class="td col-3 block-1" data-column="3">...</div>
        ...
        <div class="td col-9 block-3" data-column="9">...</div>
    </div>
...
</div>

通过这种方式,我可以通过分别查询最近的data-row.td.tr.td来轻松地获得已编辑的行和列。

现在,当一些单元格被编辑时,我将只在进行编辑的行/列中查找副本(而不是整个面板)。

代码语言:javascript
复制
$('.sudoku input').change(function() {

    var editedCell = $(this).closest('.td')[0];

    // get the row and col where the edit happened
    var row = $(this).closest('.tr').data('row'),
        col = $(this).closest('.td').data('column'),
        val = $(this).val();

    var hasDups = false;

    // check if any other cells in the same row has same value
    // note: can be made simpler with $(this).siblings().each(...)
    $('.sudoku .tr[data-row='+row+']').each(function() {
        if($(this).find('input').val() === val && this !== editedCell) {
            $(this).addClass('duplicate');
            hasDups = true;
        }
    });

    // check if any other cells in the same col has same value
    $('.sudoku .td[data-col='+col+']').each(function() {
        if($(this).find('input').val() === val && this !== editedCell) {
            $(this).addClass('duplicate');
            hasDups = true;
        }
    });
    if(hasDups) $(this).addClass('duplicate');
});
票数 3
EN

Stack Overflow用户

发布于 2015-05-10 12:15:40

我想像这样的东西会起作用:

代码语言:javascript
复制
$('.sudoku input').change(function () {
    var values = {};
    var clean = true;
    $('.sudoku input').each(function (index, input) {
        if (values[input.value]) {
            input.classList.add('error');
            clean = false;
        } else values[input.value] = input;
    });
    if (!clean) $('div.message').html('Please... no duplicate values...');
});

通过这种方式,它循环所有输入并将它们的值作为新对象中的key添加。如果key已经存在于该对象中,它将将类添加到复制中,并更改clean标志,从而发出错误消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30151170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档