2017-10-17 69 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();