2017-05-28 153 views
-1

所有元素我有一個數組,看起來像:的Javascript過濾器和匹配陣列

var testArr = ["40", "A1", "B9", "58"] 

我要循環某一類的所有div元素,並只返回元素,其中的數據屬性匹配任何該數組中的項目。

如果我做這樣的事情:

$("div.prodCodes").filter(function(e) { 
    var x1 = $(this); 
    var x2 = $(this).data("prodCode"); 

    testArr.forEach(function(e) { if (e == x2) { console.log("MATCH"); } }); 
}); 

該控制檯輸出匹配的正確的號碼,但我不能回報從過濾功能的那些元素。

我到底在想什麼?我嘗試過創建一個新陣列並將每個項目推送到它並返回,但它總是空的。我確信我在這裏錯過了一些明顯的東西。我也嘗試使用.grep()重寫,並且無處可去。幫助表示讚賞。

回答

0

我會用一個Set恆定時間查找。

要知道,jQuery的使用data方法時讀取屬性值「58」的數字,所以它不會匹配,除非你確保數據類型是相同的:

// Use a set 
 
var testSet = new Set(["40", "A1", "B9", "58"]); 
 

 
var texts = $("div.prodCodes").filter(function() { 
 
    var x = $(this).data("prodCode").toString(); // data type must match 
 
    // Return a boolean to indicate whether the div element should be kept 
 
    return testSet.has(x); // Set#has() is fast 
 
}).map(function(){ 
 
    // For demo only: get the text content of the matching div elements 
 
    return $(this).text(); 
 
}).get(); // convert that to a plain array 
 

 
console.log(texts);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="prodCodes" data-prod-code="A1">Hello</div> 
 
<div class="prodCodes" data-prod-code="XX">Not this one</div> 
 
<div class="prodCodes" data-prod-code="58">There</div>

+0

什麼是downvote?據我所知,它在代碼片段中完成了這項工作,並強調了數據類型不匹配問題。有人能解釋我錯過了什麼嗎? – trincot

+0

我沒有倒下你,別人也沒有。這對我所需要的東西來說過分了,但是你解決了我的問題。我有一個數據類型不匹配,toString()轉換修復了我的問題。 –

+1

確實,我添加了一些額外的代碼來顯示結果,因爲文本顯示比整個「div」節點更好。我添加了Set的思想,因爲它導致* O(n)*時間複雜性而不是* O(nm)*,其中* n *是'div'元素的數量,* m *測試陣列。對於那些確實有點過分的小數據,但它並沒有傷害,並且不會讓你的代碼變大。 – trincot

1

您需要返回filter()中的真實值以包含項目。

嘗試:

$("div.prodCodes").filter(function(e) { 
    return testArr.indexOf($(this).attr('data-prodCode')) >-1; 
}).doSomething(); 

沒有一個return的所有項目都將被排除

+0

這樣做只會匹配testArr中的FIRST元素。所以我應該收回60個項目,這隻匹配任何「40」,在我的數據集中是5項。 –

+1

提供[mcve],它複製問題 – charlietfl

+0

數據類型不匹配。如果我說$(this).data(「prodCode」)。toString(),它工作正常。我在一個小時前得到了您的確切解決方案,但無法弄清楚爲什麼它只返回第一個元素。 –