Как узнать, содержит ли массив конкретную строку в JavaScript / jQuery? [Дубликат]

340

Может ли кто-нибудь сказать мне, как определить, появляется ли "specialword" в массиве? Пример:

categories: [
    "specialword"
    "word1"
    "word2"
]
  • 0
    В чистом JS: stackoverflow.com/a/25765186/1320932
  • 8
    чистый JS: category.include ("специальное слово")
Показать ещё 2 комментария
Теги:
string
arrays

5 ответов

583
Лучший ответ

Вам действительно не нужен jQuery для этого.

var myarr = ["I", "like", "turtles"];
var arraycontainsturtles = (myarr.indexOf("turtles") > -1);

или

function arrayContains(needle, arrhaystack)
{
    return (arrhaystack.indexOf(needle) > -1);
}

Стоит отметить, что array.indexOf(..) не поддерживается в IE < 9, но функция jQuery indexOf(...) будет работать даже для старых версий.

  • 0
    Я не согласен с ie.microsoft.com/testdrive/HTML5/ECMAScript5Array/Default.html, и я только что проверил его.
  • 2
    Джеймс, на этой странице сказано, что он будет работать в IE9, как я уже говорил. Вы работали на IE <9? Я считаю, что я столкнулся с этой функцией как отсутствующей в IE7 и IE8, но на самом деле не тестировал; вместо этого я полагался на developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Показать ещё 5 комментариев
485

jQuery предлагает $.inArray:

Обратите внимание, что inArray возвращает индекс найденного элемента, поэтому 0 указывает, что элемент является первым в массиве. -1 указывает, что элемент не найден.

var categoriesPresent = ['word', 'word', 'specialword', 'word'];
var categoriesNotPresent = ['word', 'word', 'word'];

var foundPresent = $.inArray('specialword', categoriesPresent) > -1;
var foundNotPresent = $.inArray('specialword', categoriesNotPresent) > -1;

console.log(foundPresent, foundNotPresent); // true false
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Отредактируйте 3.5 года спустя

$.inArray эффективно является оберткой для Array.prototype.indexOf в браузерах, которые ее поддерживают (почти все из них в наши дни), обеспечивая при этом прокладку в тех, которые этого не делают. Это по существу эквивалентно добавлению прокладки к Array.prototype, что является более идиоматическим /JSish способом делать вещи. MDN предоставляет такой код. В эти дни я бы использовал этот параметр, вместо использования обертки jQuery.

var categoriesPresent = ['word', 'word', 'specialword', 'word'];
var categoriesNotPresent = ['word', 'word', 'word'];

var foundPresent = categoriesPresent.indexOf('specialword') > -1;
var foundNotPresent = categoriesNotPresent.indexOf('specialword') > -1;

console.log(foundPresent, foundNotPresent); // true false

Отредактируйте еще 3 года спустя

Гош, 6.5 лет?!

Лучшим вариантом для этого в современном Javascript является Array.prototype.includes:

var found = categories.includes('specialword');

Никаких сравнений и не путать результаты -1. Он делает то, что мы хотим: он возвращает true или false. Для старых браузеров это полиполняет с использованием кода в MDN.

var categoriesPresent = ['word', 'word', 'specialword', 'word'];
var categoriesNotPresent = ['word', 'word', 'word'];

var foundPresent = categoriesPresent.includes('specialword');
var foundNotPresent = categoriesNotPresent.includes('specialword');

console.log(foundPresent, foundNotPresent); // true false
  • 0
    Как бы я передать массив категорий внутри inArray ()? (это данные из фида JSON) Вот пример того, как я получаю ссылки, которые работают (но это не массив): var link = post.permalink ;. Использование post.categories возвращает эту ошибку в console.log: «невозможно преобразовать ноль в объект».
  • 0
    @ Я не знаю без кода. Разобрать свой JSON сложно, не увидев его, и это не совсем такой вопрос ...
Показать ещё 21 комментарий
24

Здесь вы идете:

$.inArray('specialword', arr)

Эта функция возвращает положительное целое число (индекс массива заданного значения) или -1, если данное значение не было найдено в массиве.

Живая демонстрация: http://jsfiddle.net/simevidas/5Gdfc/

Вероятно, вы хотите использовать это так:

if ( $.inArray('specialword', arr) > -1 ) {
    // the value is in the array
}
10

Вы можете использовать цикл for:

var found = false;
for (var i = 0; i < categories.length && !found; i++) {
  if (categories[i] === "specialword") {
    found = true;
    break;
  }
}
  • 16
    Я могу быть совершенно неправ в этом, но не хотите ли вы объявить меня в цикле for? Если вы не поместите «var» впереди, это поместит его в глобальный контекст (я думаю ...), что может быть не тем, что вы хотите.
  • 7
    в то время как это правда, на самом деле это не главное, что он говорит здесь. Не игнорируйте лес для нескольких деревьев.
Показать ещё 1 комментарий
4

Мне не нравится $.inArray(..), это своего рода уродливое, jQuery-ish решение, которое большинство здравомыслящих людей не потерпит. Вот фрагмент, который добавляет простой contains(str) метод в ваш арсенал:

$.fn.contains = function (target) {
  var result = null;
  $(this).each(function (index, item) {
    if (item === target) {
      result = item;
    }
  });
  return result ? result : false;
}

Аналогично, вы можете обернуть $.inArray в расширение:

$.fn.contains = function (target) {
  return ($.inArray(target, this) > -1);
}
  • 0
    Мне нравится ваша оболочка inArray, но я бы сделал ее подходящим плагином для создания цепочек .. (function ($) {..... ваш код ....}) (jQuery);
  • 5
    (Я не нижестоящий) Я не уверен, что понимаю издевательство над $ .inArray при рассмотрении метода, который опирается на $ (selector) .each (). Фактический код inArray просто использует indexOf для браузеров, которые поддерживают его изначально, или цикл for, как ответ Джареда, когда это не так. Кажется, совершенно элегантно для меня.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню