Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.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_Jquery - Fatal编程技术网

javascript数组不是唯一的

javascript数组不是唯一的,javascript,jquery,Javascript,Jquery,我创建了一个Asp.Net用户控件。为了简单起见,已经删除了一些html <asp:Panel ID="PanelInputControl" runat="server" CssClass="input-control input-period"> <div ID="InputWrapperMonth" runat="server" class="input-wrapper input-month"> <asp:TextBox ID="Te

我创建了一个Asp.Net用户控件。为了简单起见,已经删除了一些html

<asp:Panel ID="PanelInputControl" runat="server" CssClass="input-control input-period">
    <div  ID="InputWrapperMonth" runat="server" class="input-wrapper input-month">
        <asp:TextBox ID="TextBoxMonth" runat="server"
            MaxLength="2">
        </asp:TextBox>
    </div>
    <div  ID="InputWrapperYear" runat="server" class="input-wrapper input-year">
        <asp:TextBox ID="TextBoxYear" runat="server"
            MaxLength="4">
        </asp:TextBox>
    </div>
</asp:Panel>
下面是我调用的javascript函数:

function updateInputStatus($el) {

    var controls = [];

    $el.each(function () {

        $control = $(this).closest('.input-control');

        if ($.inArray($control, controls) < 0) {
            controls.push($control);
        }
    })
}
函数更新输入状态($el){
var控制=[];
$el.每个(功能(){
$control=$(this).closest('.input-control');
if($.inArray($control,controls)<0){
控件。推送($control);
}
})
}
$el是一个或多个输入控件—textbox、dropdownlist等。在本例中,假设TextBoxMonth和TextBoxYear是我们的对象,$el,javascript函数被触发

我要做的是构建一个独特的输入控件对象数组。在这个例子中,PanelInputControl将被找到两次,但是我只希望它被添加到数组中一次

实际上,代码
$.inArray($control,controls)<0
总是在任何情况下返回-1(为了在数组中找不到它),我不明白为什么

我还尝试在末尾添加此代码,
var cleanArray=$.unique(控件),但重复项仍保留在阵列中


我很困惑-有什么建议吗?

每次循环迭代创建一个新的jQuery对象时:

$control = $(this).closest('.input-control');
正是这些jQuery对象将
.push()
放入
控件中。尽管其中一些jQuery对象可能包含对相同DOM元素的引用,但您正在与
$进行比较。inArray()
是jQuery对象的核心,它们都是不同的对象,因此不重复

但是,
.nestest()
方法本身不会返回重复项,因此可以执行以下操作:

controls = $el.closest('input-control');
controls = $.map($el.closest('input-control'), function(v,i) { return $(v); });
然后,您的
控件
变量将是一个jQuery对象,它只具有
$el
中唯一的最近的
输入控件
元素

如果您特别想让
控件
成为一个jQuery对象数组,每个jQuery对象只包含一个
输入控件
元素,但没有重复项,则可以这样做:

controls = $el.closest('input-control');
controls = $.map($el.closest('input-control'), function(v,i) { return $(v); });

在每次循环迭代中,您将使用以下内容创建一个新的jQuery对象:

$control = $(this).closest('.input-control');
正是这些jQuery对象将
.push()
放入
控件中。尽管其中一些jQuery对象可能包含对相同DOM元素的引用,但您正在与
$进行比较。inArray()
是jQuery对象的核心,它们都是不同的对象,因此不重复

但是,
.nestest()
方法本身不会返回重复项,因此可以执行以下操作:

controls = $el.closest('input-control');
controls = $.map($el.closest('input-control'), function(v,i) { return $(v); });
然后,您的
控件
变量将是一个jQuery对象,它只具有
$el
中唯一的最近的
输入控件
元素

如果您特别想让
控件
成为一个jQuery对象数组,每个jQuery对象只包含一个
输入控件
元素,但没有重复项,则可以这样做:

controls = $el.closest('input-control');
controls = $.map($el.closest('input-control'), function(v,i) { return $(v); });

$(元素)==$(元素)
为false,因为它们是两个不同的对象,即使它们包含相同的DOM元素。考虑将实际DOM元素存储在<代码>控件<代码>中,而不是它们的jQuery包装器。我不明白为什么<代码> $EL < /代码>将包含一次以上的元素。而不是将jQuery对象放入数组中放置裸DOM节点。尝试<代码> $(元素)[0 ]==$(元素)[0 ] < /代码>,然后细细考虑DCoder所说的,明白他为什么这么做了吗right@dotnetnoob:DOM元素和包装该DOM元素的jQuery对象之间有区别。几乎所有jQuery函数都返回jQuery包装器,而不是原始DOM元素。这在概念上与问题非常相似-如果没有标识映射,您可以两次获取相同的数据库记录(DOM元素),并拥有它的两个单独的内存表示形式(jQuery包装器)。
$(元素)===$(元素)
为false,因为它们是两个不同的对象,即使它们包含相同的DOM元素。考虑将实际DOM元素存储在<代码>控件<代码>中,而不是它们的jQuery包装器。我不明白为什么<代码> $EL < /代码>将包含一次以上的元素。而不是将jQuery对象放入数组中放置裸DOM节点。尝试<代码> $(元素)[0 ]==$(元素)[0 ] < /代码>,然后细细考虑DCoder所说的,明白他为什么这么做了吗right@dotnetnoob:DOM元素和包装该DOM元素的jQuery对象之间有区别。几乎所有jQuery函数都返回jQuery包装器,而不是原始DOM元素。这在概念上与问题非常相似——如果没有标识映射,您可以两次获取相同的数据库记录(DOM元素),并拥有它的两个单独的内存表示(jQuery包装器)。这是一个很好的答案——这不是我在一百万年内就能实现的伟大答案——这不是我在一百万年内就能实现的