Лучший способ узнать, есть ли элемент в массиве JavaScript? [Дубликат]

В командной строке:

svn resolve --accept working <FILENAME>
748
задан Michał Perłakowski 6 January 2017 в 21:05
поделиться

6 ответов

По состоянию на 2016 ECMAScript можно использовать includes()

arr.includes(obj);

, Если Вы хотите поддерживать IE или другие более старые браузеры:

function include(arr,obj) {
    return (arr.indexOf(obj) != -1);
}

РЕДАКТИРОВАНИЕ: Это не будет работать над IE6, 7 или 8 все же. Лучшее обходное решение должно определить его самостоятельно, если это не присутствует:

  1. Mozilla (ECMA-262) версия:

      if (!Array.prototype.indexOf)
      {
    
           Array.prototype.indexOf = function(searchElement /*, fromIndex */)
    
        {
    
    
        "use strict";
    
        if (this === void 0 || this === null)
          throw new TypeError();
    
        var t = Object(this);
        var len = t.length >>> 0;
        if (len === 0)
          return -1;
    
        var n = 0;
        if (arguments.length > 0)
        {
          n = Number(arguments[1]);
          if (n !== n)
            n = 0;
          else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0))
            n = (n > 0 || -1) * Math.floor(Math.abs(n));
        }
    
        if (n >= len)
          return -1;
    
        var k = n >= 0
              ? n
              : Math.max(len - Math.abs(n), 0);
    
        for (; k < len; k++)
        {
          if (k in t && t[k] === searchElement)
            return k;
        }
        return -1;
      };
    
    }
    
  2. Daniel James версия:

    if (!Array.prototype.indexOf) {
      Array.prototype.indexOf = function (obj, fromIndex) {
        if (fromIndex == null) {
            fromIndex = 0;
        } else if (fromIndex < 0) {
            fromIndex = Math.max(0, this.length + fromIndex);
        }
        for (var i = fromIndex, j = this.length; i < j; i++) {
            if (this[i] === obj)
                return i;
        }
        return -1;
      };
    }
    
  3. версия roosteronacid :

    Array.prototype.hasObject = (
      !Array.indexOf ? function (o)
      {
        var l = this.length + 1;
        while (l -= 1)
        {
            if (this[l - 1] === o)
            {
                return true;
            }
        }
        return false;
      } : function (o)
      {
        return (this.indexOf(o) !== -1);
      }
    );
    
694
ответ дан awendt 6 January 2017 в 21:05
поделиться

Это зависит от Вашей цели. Если Вы программируете для сети, избегаете indexOf, она не поддерживается Internet  Explorer  6 (партия их все еще используемый!), или делают условное использование:

if (yourArray.indexOf !== undefined) result = yourArray.indexOf(target);
else result = customSlowerSearch(yourArray, target);

indexOf, вероятно, кодируется в собственном коде, таким образом, это быстрее, чем что-нибудь, что можно сделать в JavaScript (кроме двоичного поиска / дихотомия, если массив является соответствующим).Примечание: это - вопрос вкуса, но я сделал бы return false; в конце Вашей стандартной программы, для возврата истинной булевской переменной...

6
ответ дан Peter Mortensen 6 January 2017 в 21:05
поделиться

Во-первых, реализуйте indexOf в JavaScript для браузеров, которые уже не имеют его. Например, см. отдельно оплачиваемые предметы массива Erik Arvidsson (также, связанное сообщение в блоге ). И затем можно использовать indexOf, не волнуясь о поддержке браузера. Вот немного оптимизированная версия его indexOf реализация:

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (obj, fromIndex) {
        if (fromIndex == null) {
            fromIndex = 0;
        } else if (fromIndex < 0) {
            fromIndex = Math.max(0, this.length + fromIndex);
        }
        for (var i = fromIndex, j = this.length; i < j; i++) {
            if (this[i] === obj)
                return i;
        }
        return -1;
    };
}

Это изменяется для хранения длины так, чтобы это не должно было смотреть он каждое повторение. Но различие не огромно. Функция менее общего назначения могла бы быть быстрее:

var include = Array.prototype.indexOf ?
    function(arr, obj) { return arr.indexOf(obj) !== -1; } :
    function(arr, obj) {
        for(var i = -1, j = arr.length; ++i < j;)
            if(arr[i] === obj) return true;
        return false;
    };

я предпочитаю использовать стандартную функцию и оставлять этот вид микрооптимизации для того, когда это действительно необходимо. Но если Вы увлечены микрооптимизацией, я адаптировался сравнительные тесты что roosterononacid, связанный с в комментариях, с сравнительный тест, ищущий в массивах . Они довольно сыры, хотя, полное расследование протестировало бы массивы с различными типами, различными длинами и находящими объектами, которые происходят в различных местах.

33
ответ дан Bill the Lizard 6 January 2017 в 21:05
поделиться

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

  1. Выбор средний элемент массива.
  2. элемент, который Вы ищете больше, чем элемент, который Вы выбрали? Если так, Вы устранили нижнюю половину массива. Если это не, Вы устранили верхнюю часть.
  3. Выбор средний элемент остающейся половины массива, и продолжаются как на шаге 2, устраняя половины остающегося массива. В конечном счете Вы будете или находить свой элемент или не иметь массива в запасе для просмотра.

Двоичный поиск работает вовремя пропорциональный логарифму длины массива, таким образом, это может быть намного быстрее, чем рассмотрение каждого отдельного элемента.

11
ответ дан assortedslog 6 January 2017 в 21:05
поделиться

Вот некоторые метазнания для Вас - если Вы захотите знать то, что можно сделать с Массивом, проверьте, что документация - вот является страницей Array для Mozilla

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array

Там, то Вы будете видеть ссылку на indexOf, добавленный в Javascript 1.6

5
ответ дан Dan Dascalescu 6 January 2017 в 21:05
поделиться

Если вы используете jQuery:

$.inArray(5 + 5, [ "8", "9", "10", 10 + "" ]);

Для получения дополнительной информации: http://api.jquery.com/jQuery.inArray/

208
ответ дан 22 November 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: