Определите, есть ли строка в списке в JavaScript - PullRequest
213 голосов
/ 12 марта 2010

В SQL мы можем видеть, есть ли строка в списке следующим образом:

Column IN ('a', 'b', 'c')

Какой хороший способ сделать это в JavaScript? Это так неуклюже, чтобы сделать это:

if (expression1 || expression2 || str === 'a' || str === 'b' || str === 'c') {
   // do something
}

И я не уверен насчет производительности или ясности этого:

if (expression1 || expression2 || {a:1, b:1, c:1}[str]) {
   // do something
}

Или можно использовать функцию переключения:

var str = 'a',
   flag = false;

switch (str) {
   case 'a':
   case 'b':
   case 'c':
      flag = true;
   default:
}

if (expression1 || expression2 || flag) {
   // do something
}

Но это ужасный беспорядок. Есть идеи?

В этом случае мне нужно использовать Internet Explorer 7, так как он предназначен для корпоративной интрасети. Так что ['a', 'b', 'c'].indexOf(str) !== -1 не будет работать изначально без некоторого синтаксического сахара.

Ответы [ 15 ]

2 голосов
/ 27 августа 2011

Спасибо за вопрос и решение с использованием метода Array.indexOf.

Я использовал код из этого решения для создания функции inList (), которая, IMO, упростила бы написание и прояснила чтение:

function inList(psString, psList) 
{
    var laList = psList.split(',');

    var i = laList.length;
    while (i--) {
        if (laList[i] === psString) return true;
    }
    return false;
}

ИСПОЛЬЗОВАНИЕ:

if (inList('Houston', 'LA,New York,Houston') {
  // THEN do something when your string is in the list
}
0 голосов
/ 14 июля 2018
                var urllist = [];
                var p = null;
                for (var i = 0; i < spans.length - 1; i++) {
                    p = $(spans[i]).find('input').val();
                    if (urllist.indexOf(p) >= 0) {
                        growl.warning("input fields contains Duplicate Entries");
                        return;
                    }
                    urllist.push(p)
                };
0 голосов
/ 12 ноября 2013

Мое решение приводит к следующему синтаксису:

// Checking to see if var 'column' is in array ['a', 'b', 'c']

if (column.isAmong(['a', 'b', 'c']) {
  // Do something
}

И я реализую это путем расширения базового прототипа Object, например:

Object.prototype.isAmong = function (MyArray){
   for (var a=0; a<MyArray.length; a++) {
      if (this === MyArray[a]) { 
          return true;
      }
   }
   return false;
}

В качестве альтернативы мы можем назвать метод isInArray (но, вероятно, не inArray) или просто isIn.

Преимущества: простой, понятный и самодокументируемый.

0 голосов
/ 27 сентября 2013

Упрощенная версия ответа SLaks также работает:

if ('abcdefghij'.indexOf(str) >= 0) {
    // Do something
}

.... поскольку строки сами по себе являются массивами. :)

При необходимости внедрите функцию indexof для Internet Explorer, как описано выше.

0 голосов
/ 20 сентября 2012

Я удивлен, что никто не упомянул простую функцию, которая принимает строку и список.

function in_list(needle, hay)
{
    var i, len;

    for (i = 0, len = hay.length; i < len; i++)
    {
        if (hay[i] == needle) { return true; }
    }

    return false;
}

var alist = ["test"];

console.log(in_list("test", alist));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...