У меня есть массив, который выглядит так:

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 () и ничего не получилось. Помощь приветствуется.

-1
Mike P. 28 Май 2017 в 23:42

2 ответа

Лучший ответ

Я бы использовал Set для поиска в постоянном времени.

Имейте в виду, что jQuery читает значение атрибута "58" как число при использовании метода data, поэтому оно не будет совпадать, если вы не убедитесь, что тип данных совпадает:

// 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
trincot 28 Май 2017 в 20:58

Вам нужно вернуть истинное значение в filter(), чтобы включить элемент.

Пытаться :

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

Без return все элементы будут исключены

1
charlietfl 28 Май 2017 в 21:04