Проверка элементов массива по отношению к другому массиву - PullRequest
1 голос
/ 08 июня 2011

Я пытаюсь проверить значение в массиве и действовать соответственно на основе этого результата, то есть, если элемент не существует в проверяемом массиве, добавьте его в массив. Я уже потратил слишком много времени на это, я действительно мог бы помочь.

    function FilterItems(attrName, attrValue, priceMin, priceMax) {
        // check if item exists in filtered items
        for (var i = 0; i < adlet.item.length; i++) {  
            if (adlet.item[i][attrName] == attrValue) {
                var currentItem = adlet.item[i];
                if (filteredItems.length > 0) {
                    // console.log(filteredItems.length);
                    for (var x = 0; x < filteredItems.length; x++) {                       
                        if (filteredItems[x].OMSID == currentItem.OMSID) {  
                            // match found
                            break;           
                        } else {
                            // match not found, add to filtered items.
                            filteredItems.push(currentItem);
                        }
                    }          
                } else {
                    filteredItems.push(adlet.item[i]);
                    // console.log(filteredItems.length);
                }
            }
        }

Ответы [ 3 ]

1 голос
/ 08 июня 2011

/ * Метод массива indexOf слишком полезен, чтобы его игнорировать, если вы что-то делаете с массивами. Здесь есть прокладка, основанная на коде Mozilla.

Метод add, показанный здесь, работает как push, но он добавляет элемент только в том случае, если его еще нет в массиве. Вы можете добавить несколько элементов с несколькими аргументами.

'merge' добавит все 'новые' элементы из вызывающего массива в массив, отправленный в качестве аргумента, * /

if(!Array.prototype.indexOf){
    Array.prototype.indexOf= function(what, i){
        i= i || 0;
        var L= this.length;
        while(i< L){
            if(this[i]=== what) return i;
            ++i;
        }
        return -1;
    }
}
Array.prototype.add= function(){
    var what, a= arguments, i= 0, L= a.length;
    while(i<L){
        what= a[i++];
        if(this.indexOf(what)=== -1) this.push(what);
    }
    return this;
}
Array.prototype.merge= function(target){
    return this.add.apply(target, this);
}

var a1= [1, 2, 3, 4, 5, 6], a2= [2, 4, 6, 8, 10];
a1.merge(a2)
/*  returned value: (Array)
2, 4, 6, 8, 10, 1, 3, 5
*/
1 голос
/ 08 июня 2011

Вы добавляете currentItem в каждую итерацию, где она не найдена.filteredItems.push(currentItem); должен быть вызван после цикла, если не найден:

...

    var found = false; // new 'found' var = true if currentItem is found
    for (var x = 0; x < filteredItems.length; x++) {
        if (filteredItems[x].OMSID == currentItem.OMSID) {
            // match found
            found = true;
            break;
        }
    }

    // match not found, add to filtered items.
    if (!found) {
        filteredItems.push(currentItem);
    }

} else {
    filteredItems.push(adlet.item[i]);
    // console.log(filteredItems.length);
}

...
0 голосов
/ 08 июня 2011

Вот упрощенная версия вашей функции, которая добавляет элемент фильтра только после завершения внутреннего цикла:

function FilterItems(attrName, attrValue, priceMin, priceMax) {
   for (var i = 0; i < adlet.item.length; i++) {
      if (adlet.item[i][attrName] == attrValue) {
         var currentItem = adlet.item[i];
         var found = false;
        for (var x = 0; x < filteredItems.length; x++) {
           if (filteredItems[x].OMSID == currentItem.OMSID) {
              found = true;
              break;
           }
        }
        if (!found)
           filteredItems.push(currentItem);
      }
  }
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...