Javascript 检查属性的所有元素并修改另一个元素

Javascript 检查属性的所有元素并修改另一个元素,javascript,jquery,Javascript,Jquery,这就是我的html的外观 <tr id="group-1-11"> <tr class="child-of-group-1-11 " selected-group="1" > <tr id="group-1-12" class="child-of-group-1-11" parent-id="group-1-11" selected-group="1"> <tr class="child-of-group-1-12" parent-id="group-

这就是我的html的外观

<tr id="group-1-11">
<tr class="child-of-group-1-11 " selected-group="1" >
<tr id="group-1-12" class="child-of-group-1-11" parent-id="group-1-11"  selected-group="1">
<tr class="child-of-group-1-12" parent-id="group-1-12"  selected-group="1">
<tr class="child-of-group-1-12" parent-id="group-1-12"  selected-group="1">
<tr class="child-of-group-1-11" selected-group="1" >
<tr id="group-1-85" class="child-of-group-1-11" parent-id="group-1-11" >
<tr class="child-of-group-1-85" selected-group="1" style="display: none;">
<tr id="group-1-355" class="child-of-group-1-85" parent-id="group-1-85" selected-group="1">
<tr id="group-1-2" class="child-of-group-1-11  parent " parent-id="group-1-11">
这意味着最终我的结果应该是:

 <tr id="group-1-12" class="child-of-group-1-11" parent-id="group-1-11"  selected-group="1" checked="true">
 <tr id="group-1-85" class="child-of-group-1-11" parent-id="group-1-11" checked="true">
$.each(uniqueParentArray, function(index, parentId) {
    // retrieve not selected elements for the given parent
    var notSelectedElements = $('.child-of-'+parentId+'[selected-group!="1"]');
    // if all elements are selected
    if(notSelectedElements.length === 0) {
         $('#'+parentId).attr("checked", true);
    }
});

但是具有
id=“group-1-11”
的元素不应具有该属性
checked=“true”

我希望背景是清楚的。我可能在脚本中有一个bug,因此结果输出不符合预期。请帮助我修复该错误,我希望
allSelected
为布尔值,但我可能不太熟悉该方法。

。each()
不能按您的要求运行。您需要在调用
.each()
之前创建一个变量,然后在遇到所需条件时修改该变量

$.each(uniqueParentArray, function(index, parentId) {
    var allSelected = true;
    $('.child-of-'+parentId).each(function(){
        var selectedGroup = $(this).attr('selected-group');
        if(selectedGroup != '1') {
            allSelected = false;
        }
    });
    if(allSelected) {
        $('#'+parentId).attr("checked", true);
    }
});
此代码将循环通过-(parentID)元素的所有
.child。如果其中任何一个没有选择
group=“1”
,则循环完成时
所有选择的
将为false


更一般地说,我建议对非标准HTML属性使用
data-
属性。这样,您的标记将保持有效。

在jQuery
中返回true
。每个
继续相同在for循环中
returnfalse
相当于
break。所有这些都不会用作迭代的返回值,并传递给
allSelected
。您可能会看到类似于
.filter
的内容,而不是
.each
,这是一个reduce,返回false意味着元素被排除在列表之外

像这样的事情可能会奏效:

$('#' + uniqueParentArray.join(', #')).attr('checked', function() {
   return $('.child-of-' + $(this).attr('id')).filter(function() {
      return $(this).attr('selected-group') != '1';
   }).length == 0;
});

您可以尝试以下方法:

 <tr id="group-1-12" class="child-of-group-1-11" parent-id="group-1-11"  selected-group="1" checked="true">
 <tr id="group-1-85" class="child-of-group-1-11" parent-id="group-1-11" checked="true">
$.each(uniqueParentArray, function(index, parentId) {
    // retrieve not selected elements for the given parent
    var notSelectedElements = $('.child-of-'+parentId+'[selected-group!="1"]');
    // if all elements are selected
    if(notSelectedElements.length === 0) {
         $('#'+parentId).attr("checked", true);
    }
});

隐马尔可夫模型!!我为什么不想想,谢谢你,杰克沃兹。但这确实需要不必要的循环,再次感谢您,但我想我也会等待其他解决方案。