【问题标题】:Best way to check if several inputs have the same value检查多个输入是否具有相同值的最佳方法
【发布时间】:2016-06-27 01:12:24
【问题描述】:

我有一些输入(随机数 > 0),每个输入都在一个具有相同类的 div 中,所以我有这个结构:

<div class="myclass"> <!-- div #1 -->
    <input name="name" class="input">
    <!-- other inputs that don't take care -->
</div>
...
<div class="myclass"> <!-- div #n -->
    <input name="name" class="input">
    <!-- other inputs that don't take care -->
</div>

我需要检查每个输入的值是否与其他输入不匹配,所以如果我在第一个输入中将 myname 作为输入中的值 n 我不能有 @ 987654323@.

我有下一个 JQuery 代码来遍历所有 div 以提取有关每个 div 的信息。

$('.myclass').each(function() {
    input = $(this).find('input[name="name"]').val();
});

然后,它通过 jQuery ajax 将所有信息(之前解析的 JSON)发送到必须重新验证输入值不相等的 PHP 脚本。

所以,问题是:检查所有 div 并知道 value 是否重复的最佳方法是什么?我考虑过在每个元素中创建一个 $.each ,我必须遍历所有元素,但我不知道它的性能。

那么 PHP 脚本呢,最好的方法是什么? 谢谢。

注意:JSON 解析数组,现在有这个结构:

{"user_info":{"app_id":0,"user_id":0},"contact":{"has_contact":0},"menu_items":[{"position":0,"name":"Nosotros","icon_id":"ic_delete_black_48dp.png","content":"nosotros"},{"position":1,"name":"Precios","icon_id":"ic_help_black_48dp.png","content":"nosotros"}]}

不要担心“user_info”和“has_contact”它们无关紧要,我所说的 name 是 menu_items[index]['name'] 值。

【问题讨论】:

  • 不难测试独特性......不完全清楚,但如果它们不是独特的,目标是什么。是否所有唯一性都被提交并丢弃重复项?或者只是测试没有重复,然后才提交?
  • 主要思想是当找到第一个重复项时抛出错误并停止代码。问题不在于我该怎么做,我知道怎么做,问题在于性能。谢谢。
  • 性能方面,循环一次并在 hashmap 中存储/签入最快
  • Hashmap == js 对象或者关联数组,不是吗?

标签: javascript php jquery html json


【解决方案1】:

您可以使用$.map().slice()$.unique().length

// return `input` values
var inputs = $.map($(".myclass input"), function(el) {return el.value});
// check if `unique` array `.length` is equal to `unique` array `.length`
var unique = $.unique(inputs.slice(0)).length === inputs.length;

console.log(inputs, unique);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="myclass"> <!-- div #1 -->
    <input name="name" class="input" value="abc">
    <!-- other inputs that don't take care -->
</div>
...
<div class="myclass"> <!-- div #n -->
    <input name="name" class="input" value="abc">
    <!-- other inputs that don't take care -->
</div>

【讨论】:

  • 嗨,我唯一不明白的是你为什么要在 $.unique() 函数上切片数组。我知道 $.unique 删除了重复的元素,所以如果返回数组长度!= 原始数组长度有一个重复但为什么 slice(0) 数组?谢谢:D
  • @legomolina “但是为什么要对数组进行切片(0)?” $.unique() 会改变原来的 inputs 数组。试试var arr = [1,1,2]; $.unique(arr); console.log(arr);
【解决方案2】:

另一种方法 (代码示例未显示 ...) 是创建一个散列,其中每个接收到的值 (i-f 它是一个字符串或者可以明确地强制为一个...)是关键,而无关值是价值。

从一个空的哈希开始。对于每个输入,测试与该输入匹配的键是否已存在于哈希中。如果是这样,那你就上当了。如果没有,请将输入添加为新键。 (关联的值无所谓……)检查所有输入后,可以丢弃散列。

(此策略适用于任何支持哈希的编程语言......如今,它是“所有这些”。原则上,它也是一种计算任何特定元素出现次数的有效方法。)

警告:不要使用这种技术,其中输入值的数据类型与底层集合类型的数据类型不同,在 JavaScript 中它是(仅)“字符串”,并且您认为“不同”的两个输入完全有可能被强制转换为相同的(字符串)键值。算法将无法区分它们。

【讨论】:

    【解决方案3】:

    如果我必须用 PHP 来做这件事,我会使用 array_unique() 函数....

    【讨论】:

      猜你喜欢
      • 2020-02-03
      • 2011-10-18
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      相关资源
      最近更新 更多