Проверка, содержит ли массив заданный элемент - PullRequest
1 голос
/ 23 ноября 2011

У меня есть массив чисел и динамически добавляются новые числа в этот массив в цикле for. Но мне нужно избегать добавления значений, которые уже существуют в массиве. Есть ли собственный способ JS, чтобы проверить наличие некоторого значения в массиве, не делая 2-й вложенный цикл. Я не хочу использовать вложенный цикл, потому что размер массива может варьироваться до 10000

Ответы [ 5 ]

7 голосов
/ 23 ноября 2011

Вы можете использовать собственный JavaScript Array.prototype.indexOf, поддерживаемый в большинстве браузеров: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf

 var a = [1, 2, 3];
 console.log(a.indexOf(4));   // -1

indexOf быстрее, чем цикл for, но алгоритмическая сложность все еще O(n^2).Если размер массива становится намного больше, рассмотрим другую структуру данных, например хеш-таблицу.

2 голосов
/ 14 мая 2018

Просто используйте includes.

var array1 = [1, 2, 3];
console.log(array1.includes(2)); // true
2 голосов
/ 23 ноября 2011

Вы можете легко избежать цикла for, используя цикл while. [Пауза для смеха ...] А если серьезно, даже встроенный метод Array.indexOf() (поддерживаемый большинством браузеров), вероятно, использует цикл внутри.

Вместо этого вы можете использовать обычный объект и добавлять каждое число к объекту как свойство, а затем брать значения из объекта и помещать их в фактический массив (или просто использовать их в объекте, если это удобно) , Тогда вам нужно всего лишь один раз в конце просмотреть «до 10000» чисел:

var numbersObj = {},
    numbersArray = [];

// your existing for statement here
for (var i=0; i<something; i++) {
   var currentNumber = somethingElse(); // whatever your existing code is to
                                    // determine the number to add goes here

   // put the number in the object (as a key)
   numersObj[currentNumber] = true;
}

// copy numbers out of object into array
for (var k in numbersObj)
   if (numbersObj.hasOwnProperty(k))
      numbersArray.push(k);

После чего numbersArray содержит только уникальные числа. Тест if с .hasOwnProperty() является «необязательным» в зависимости от вашей точки зрения.

В первом цикле вы можете проверить, содержит ли numbersObj currentNumber:

if (!numbersObj[currentNumber])
   numbersObj[currentNumber] = true;

Или просто (пере) пишите это каждый раз, как я делал в первом блоке кода.

1 голос
/ 23 ноября 2011

попробуйте это,

function eleContainsInArray(arr,element){
    if(arr != null && arr.length >0){
        for(var i=0;i<arr.length;i++){
            if(arr[i] == element)
                return true;
        }
    }
    return false;
 } 
0 голосов
/ 23 ноября 2011

Существует Array.indexOf , который поддерживается из некоторых браузеров, вы можете использовать этот фрагмент кода для поддержки всех браузеров

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...