Поиск значения в массиве javascript - PullRequest
0 голосов
/ 12 мая 2011

Я пытаюсь настроить оператор IF, если значение содержится в массиве.

Я нашел код, который утверждал, что он работает, но, похоже, он не работает.

var myAsi = ['01','02','24OR01','30De01','9thC01','A.Hu01','A01','AACAMSTE','ABBo01','ABBo02','ABC-01','ACCE01','Acce02','AceR01','h+dm01','Merr02','Ofak01','Wage01','Youn01'];

Array.prototype.find = function(searchStr) {
  var returnArray = false;
  for (i=0; i<this.length; i++) {
    if (typeof(searchStr) == 'function') {
      if (searchStr.test(this[i])) {
        if (!returnArray) { returnArray = [] }
        returnArray.push(i);
      }
    } else {
      if (this[i]===searchStr) {
        if (!returnArray) { returnArray = [] }
        returnArray.push(i);
      }
    }
  }
  return returnArray;
}

var resultHtml = '';
resultHtml+='<table style ="width: 400px">';
resultHtml+='<tr colspan="2">';
resultHtml+='<td colspan="2">';
resultHtml+='<b><font color = "Red">(Client Code)</font><br><font color = "green">(Company Name)</font></b>';
resultHtml+='</td>';
resultHtml+='</tr>';

$.each(data, function(i,item){
  resultHtml+='<div class="result">';
  resultHtml+='<tr>';
  if (notFound=myAsi.find("'"+item.code+"'") == false) {
    resultHtml+='<td>';
  }
  else {
    resultHtml+='<td bgcolor=#D8D8D8>';
  }
  resultHtml+='<font color = "red">'+item.code+'</font><br>';
  resultHtml+='<font color = "green">'+item.content+'</font></td>';
  resultHtml+='<td style ="width: 80px"><a href="delete.php?UserID=<?php echo $userID ?>&AddCode='+item.code+'">Remove</a> - ';
  resultHtml+='<a href="insert.php?UserID=<?php echo $userID ?>&AddCode='+item.code+'">Add</a>';
  resultHtml+='</td>';
  resultHtml+='</tr>';
  resultHtml+='</div>';
  });
resultHtml+='</table>';

Элемент item.code циклически проходит, и мне нужен оператор IF, чтобы сообщить мне, появляется ли он в массиве.

Любая помощь была бы великолепна.

Ответы [ 5 ]

1 голос
/ 12 мая 2011
Array.prototype.contains = function(value, matcher) {
    if (!matcher || typeof matcher !== 'function') {
        matcher = function(item) {
            return item == value;
        }
    }
    for (var i = 0, len = this.length; i < len; i++) {
        if (matcher(this[i])) {
            return true;
        }
    }
    return false;
};

Возвращает true для элементов в массиве, которые описывают условия, определенные в matcher.Реализуйте так:

var arr = ['abc', 'def', 'ghi'];   // the array
var valueToFind= 'xyz';  // a value to find in the array

// a function that compares an array item to match
var matcher = function(item) {
    return item === matchThis;
};

// is the value found?
if (arr.contains(valueToFind, matcher)) {
    // item found 
} else {
    // item not found 
}

ОБНОВЛЕНИЯ: Изменен метод содержимого для получения значения и дополнительной функции сопоставления.Если совпадение не включено, оно выполнит простую проверку на равенство.

Проверьте это на jsFiddle.net: http://jsfiddle.net/silkster/wgkru/3/

1 голос
/ 12 мая 2011

Если вы хотите только определить, находится ли элемент в массиве, вы можете использовать более простую функцию, чем эта.Например,Реализация jQuery:

// returns index of the element or -1 if element not present
function( elem, array ) {
    if ( array.indexOf ) {
        return array.indexOf( elem );
    }
    for ( var i = 0, length = array.length; i < length; i++ ) {
        if ( array[ i ] === elem ) {
            return i;
        }
    }
    return -1;
},

Используется собственная реализация браузера indexOf, если она доступна (все браузеры, кроме IE, я думаю), в противном случае выполняется ручной цикл.

1 голос
/ 12 мая 2011

Попробуйте удалить апострофы из вашего find() звонка.например,

notFound=myAsi.find(item.code)

Хотя на самом деле, для ваших целей, смотрите этот пример , который использует эту функцию ....

Array.prototype.find = function(searchStr) {
       for (var i=0; i<this.length; i++) {
           if (this[i]==searchStr) return true;
       };
     return false;    
    };

И в качестве отступления - будьте очень осторожныоб использовании var перед использованием переменной - в противном случае вы создаете глобальную переменную (которую вы, вероятно, не хотите).то есть строка в вашей исходной функции ....

for (i=0; i<this.length; i++)

i теперь глобальная ...

0 голосов
/ 14 мая 2011

Стандартным способом определения индекса первого вхождения данного значения в массиве является метод indexOf объектов Array.

Этот код проверяет, поддерживается ли этот метод, и реализует его, если нет, чтобы он был доступен для любого объекта Array:


if(Array.prototype.indexOf==null)
Array.prototype.indexOf = function(x){
    for(var i=0, n=this.length; i<n; i++)if(this[i]===x)return i;
    return -1;
};

Теперь myArray.indexOf(myValue) возвращает первый индекс myValue в myArray или -1, если не найден.

0 голосов
/ 12 мая 2011

Вы можете просто использовать встроенную функцию

['a','b','c'].indexOf('d') == -1

Такое поведение было предписано в спецификации JavaScript более 6 лет назад.Хотя я отказался от Internet Explorer по этим причинам около IE8, из-за этой невероятно плохой поддержки стандартов.Если вы заботитесь о поддержке очень старых браузеров, вы можете использовать http://soledadpenades.com/2007/05/17/arrayindexof-in-internet-explorer/, чтобы использовать свой собственный Array.indexOf

Я не помню, чтобы IE9 поддерживал [] .indexOf, но Microsoft утверждает, что это так.: http://msdn.microsoft.com/en-us/library/ff679977(v=VS.94).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...