2017-10-17 51 views
0

我有多个类(品牌和颜色)类似的div:由多个类之一查找重复

<div id="pad"> 
    <div class="bmw white"> </div> 
    <div class="porsche yellow"> </div> 
    <div class="porsche red"> </div> 
    <div class="bmw white"> </div> 
    <div class="bmw blue"> </div> 
    <div class="bmw white"> </div> 
</div> 

<div id="same"></div> 

当我需要知道我有多少重复的品牌在#pad我用这个代码:

function sameCars() { 
    var elems = $("#pad div").length; 
    var brands = ['bmw', 'porsche']; 
    for (var i=0; i<brands.length; i++) { 
     var k = 0; 
     for (var j=0; j<elems; j++) { 
      var mainDiv = document.getElementById('pad'), 
       childDiv = mainDiv.getElementsByTagName('div')[j]; 
      if(childDiv.className.split(' ')[0] == brands[i]) { 
       k = k+1; 
      } 
     } 
     addiv = document.getElementById("same"); 
     addiv.innerHTML += brands[i] + ": " + k; 
    } 
} 

现在,我想在我的代码更改:

1)找到的所有类副本(可能有多个类,第一种是BR第二个是颜色等)如宝马:4,保时捷:2,白色:3,黑色:3,轿车:2,轿跑车:3

2)不使用品牌,颜色列表等等。我不想列出所有可能的颜色或汽车品牌的长列表。刚刚得到的类名

3)色彩让我的代码更短,更优雅

+0

你究竟想要什么? –

+0

1)和2)。 3)没有必要 –

+0

你想摆脱创建这样的汽车阵列? –

回答

0

你只需要动态地收集所有类拳头:

$(document).ready(function() { 
 
    var duplicates = {}; 
 
    var $pad = $('#pad'); 
 

 
    $('#pad > div').each(function() { 
 
    var classes = $(this)[0].classList; 
 

 
    for (var i = 0; i < classes.length; i++) { 
 
     if (typeof duplicates[classes[i]] === 'undefined') { 
 
     duplicates[classes[i]] = 1; 
 
     } else { 
 
     duplicates[classes[i]]++; 
 
     } 
 
    } 
 
    }); 
 
    
 
    for (var j in duplicates) { 
 
    $pad.append('<div>'+j+':'+duplicates[j]+'</div>'); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="pad"> 
 
    <div class="bmw white"> </div> 
 
    <div class="porsche yellow"> </div> 
 
    <div class="porsche red"> </div> 
 
    <div class="bmw white"> </div> 
 
    <div class="bmw blue"> </div> 
 
    <div class="bmw white"> </div> 
 
</div> 
 

 
<div id="same"></div>

-1

JavaScript示例(没有的jQuery需要)

var parentWrapper = document.getElementById('pad'); 
var displayWrapper = document.getElementById('same'); 
var classesList = getUniqueClassList(parentWrapper); 
displayCounts(classesList); 

function displayCounts(list) { 
    for (var className in list) { 
    var number = list[className]; 
    displayWrapper.innerHTML += className + ' ' + number + '<br>'; 
    } 
} 

function getUniqueClassList(wrapper) { 
    var list = {}; 
    for (var elem of wrapper.getElementsByTagName('div')) { 
    for (var cssClass of elem.classList) { 
     if (!list[cssClass]) { 
       list[cssClass] = 1; 
     } else { 
     list[cssClass]++; 
     } 
    } 
    } 
    return list; 
} 

小提琴https://fiddle.jshell.net/r1rk1xL3/5/

+0

你有两种以上的课程?如果你有'白色宝马'和'宝马红色',甚至更好'白色宝马和白色宝马4门',会怎么样? – Justinas

+0

@Justinas getUniqueClassList方法获取所需类的位置作为第二个参数,因为如您所说,您可能想要为另一个属性创建第三个类,则只需传递目标类的正确索引即可。显然,由于您希望动态获取品牌列表,您需要按照相同的顺序设置班级的颜色。 –

+0

并不总是可以有类相同的顺序,如果有一些省略的类,你仍然必须把一些空白/没有风格的类只是为了你的代码维护...非常不好的想法 – Justinas

0

您可以使用jquery动态获取类并应用逻辑来获得像这样的唯一计数。

sameCars(); 
 
function sameCars() { 
 
    var brands = []; 
 
    var colors = []; 
 
    $("#pad div").each(function(){ 
 
     brands.push($(this).attr("class").split(' ')[0]) 
 
     colors.push($(this).attr("class").split(' ')[1]) 
 
    }); 
 
    //console.log(brands) 
 
    //console.log(colors) 
 
    var cars_count = {}; 
 
    $.each(brands, function(index, value) { 
 
     cars_count[value] = cars_count[value] + 1 || 1; 
 
    }); 
 
    console.log("Unique cars count :") 
 
    console.log(cars_count); 
 
    
 
    var count_color = {}; 
 
    $.each(colors, function(index, value) { 
 
     count_color[value] = count_color[value] + 1 || 1; 
 
    }); 
 
    console.log("Unique Colors count :") 
 
    console.log(count_color); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="pad"> 
 
    <div class="bmw white"> </div> 
 
    <div class="porsche yellow"> </div> 
 
    <div class="porsche red"> </div> 
 
    <div class="bmw white"> </div> 
 
    <div class="bmw blue"> </div> 
 
    <div class="bmw white"> </div> 
 
</div> 
 

 
<div id="same"></div>

+0

与Eduardo的回答一样:您的课程必须始终保持相同的顺序,并且创建新的课程组将需要修改代码。 – Justinas

+0

这是正确的!但根据HTML结构,我们甚至不能确定哪个是汽车名称,哪个是颜色名称。他应该在他的dom元素中使用一些HTML属性,如data-car-name,data-color-name。 –

+0

为什么?它具有不同的颜色,这就是具有不同类别所需的一切。 – Justinas

0

这里得到你想要的东西的一个很好的方式。 注意我不操纵DOM,我会留给你。

function classIsDup(className, setOfClasses) 
{ 
    return (setOfClasses.indexOf(className) > -1); 
} 

function getDuplicates() 
{ 
    var setOfClasses = []; 
    var listOfDuplicates = []; 
    $('#pad').children('div').each(function(index) { 

     if(classIsDup($(this).attr('class'), setOfClasses)) 
     { 
      listOfDuplicates.push($(this).attr('class')); 
     } 
     else 
     { 
      setOfClasses.push($(this).attr('class')); 
     } 
    }); 
    // just in case dups exist within the list of dups 
    $.uniqueSort(listOfDuplicates); 
} 

getDuplicates();