Подтвердить что ты не робот

В javascript, как искать массив для подстроки

Мне нужно найти массив в javascript. Поиск будет состоять только в том, что только часть строки соответствует тому, что строка будет иметь дополнительные номера, назначенные ей. Затем мне нужно было бы возвратить успешно подобранный элемент массива с полной строкой.

то есть.

var windowArray = new Array ("item","thing","id-3-text","class");

Мне нужно найти элемент массива с "id-" в нем, и мне нужно также вытянуть остальную часть текста в элементе (т.е. "id-3-text").

Спасибо

4b9b3361

Ответ 1

В вашем конкретном случае вы можете сделать это только со скучным старым счетчиком:

var index, value, result;
for (index = 0; index < windowArray.length; ++index) {
    value = windowArray[index];
    if (value.substring(0, 3) === "id-") {
        // You've found it, the full text is in `value`.
        // So you might grab it and break the loop, although
        // really what you do having found it depends on
        // what you need.
        result = value;
        break;
    }
}

// Use `result` here, it will be `undefined` if not found

Но если ваш массив sparse, вы можете сделать это более эффективно с правильно спроектированным циклом for..in:

var key, value, result;
for (key in windowArray) {
    if (windowArray.hasOwnProperty(key) && !isNaN(parseInt(key, 10))) {
        value = windowArray[key];
        if (value.substring(0, 3) === "id-") {
            // You've found it, the full text is in `value`.
            // So you might grab it and break the loop, although
            // really what you do having found it depends on
            // what you need.
            result = value;
            break;
        }
    }
}

// Use `result` here, it will be `undefined` if not found

Остерегайтесь наивных циклов for..in, которые не имеют проверок hasOwnProperty и !isNaN(parseInt(key, 10)); вот почему.


Off-тему

Другой способ записи

var windowArray = new Array ("item","thing","id-3-text","class");

является

var windowArray = ["item","thing","id-3-text","class"];

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

Ответ 2

Если вы можете использовать Underscore.js в своем проекте, функция массива _.filter() сделает это несложно:

// find all strings in array containing 'thi'
var matches = _.filter(
    [ 'item 1', 'thing', 'id-3-text', 'class' ],
    function( s ) { return s.indexOf( 'thi' ) !== -1; }
);

Функция итератора может делать все что угодно, если она возвращает true для совпадений. Работает отлично.

Обновление 2017-12-03:
Это довольно устаревший ответ сейчас. Возможно, не самый эффективный вариант в большом пакете, но он может быть написан гораздо более кратко и теперь использовать встроенные методы ES6 Array/String, такие как .filter() и .includes():

// find all strings in array containing 'thi'
const items = ['item 1', 'thing', 'id-3-text', 'class'];
const matches = items.filter(s => s.includes('thi'));

Примечание: поддержка String.prototype.includes() поддерживается <= IE11 (Edge работает, заметьте), но вы хорошо справляетесь с polyfill или просто возвращаетесь к indexOf().

Ответ 3

Люди здесь делают это слишком сложно. Просто сделайте следующее...

myArray.findIndex(element => element.includes("substring"))

findIndex() - это метод более высокого порядка ES6, который перебирает элементы массива и возвращает индекс первого элемента, который соответствует некоторым критериям (предоставляется как функция). В этом случае я использовал синтаксис ES6 для объявления функции более высокого порядка. element - это параметр функции (это может быть любое имя), а жирная стрелка объявляет то, что следует, как анонимную функцию (которую не нужно заключать в фигурные скобки, если она не занимает более одной строки).

В findIndex() я использовал очень простой includes() в includes() метод, чтобы проверить, если текущий элемент содержит подстроку, которую вы хотите.

Ответ 4

Просто ищите строку в обычном старом indexOf

arr.forEach(function(a){if (typeof(a) == 'string' && a.indexOf('curl')>-1) console.log(a);})

Ответ 5

Для увлекательного изучения некоторых альтернатив и их эффективности см. недавние сообщения Джона Ресига:

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

Ответ 6

Самый простой код javascript для ванилин для достижения этого -

var windowArray = ["item", "thing", "id-3-text", "class", "3-id-text"];
var textToFind = "id-";

//if you only want to match id- as prefix 
var matches = windowArray.filter(function(windowValue){
  if(windowValue) {
      return (windowValue.substring(0, textToFind.length) === textToFind);
  }
}); //["id-3-text"]

//if you want to match id- string exists at any position
var matches = windowArray.filter(function(windowValue){
  if(windowValue) {
      return windowValue.indexOf(textToFind) >= 0;
  }
}); //["id-3-text", "3-id-text"]

Ответ 7

myArray.find(element => element.includes("substring"));

Это вернет фактический элемент из массива.

myArray.findIndex(element => element.includes("substring"));

Это вернет индекс элемента из массива.

Ответ 8

исх: В javascript, как искать массив для соответствия подстроки

Решение, данное здесь, является общим, в отличие от решения 4556343 # 4556343, для которого требуется предыдущий синтаксический анализ, чтобы идентифицировать строку, с которой join(), который не является компонентом любой из строк массива.
Кроме того, в этом коде /!id-[^!]*/ вернее, /![^!]*id-[^!]*/ в соответствии с параметрами вопроса:

  • "искать массив..." (строк или чисел, а не функций, массивов, объектов и т.д.).
  • "только для части строки, которая соответствует" (совпадение может быть где угодно)
  • "возвращает... соответствующий... элемент" (единственное, а не ВСЕ, как в "... the... elementS" )
  • "с полной строкой" (включая кавычки)

... Решения NetScape/FireFox (см. ниже для решения JSON):

javascript:         /* "one-liner" statement solution */
   alert(
      ["x'!x'\"id-2",'\' "id-1 "',   "item","thing","id-3-text","class" ] .
         toSource() . match( new RegExp( 
            '[^\\\\]("([^"]|\\\\")*' + 'id-' + '([^"]|\\\\")*[^\\\\]")' ) ) [1]
   );

или

javascript:
   ID = 'id-' ;
   QS = '([^"]|\\\\")*' ;           /* only strings with escaped double quotes */
   RE = '[^\\\\]("' +QS+ ID +QS+ '[^\\\\]")' ;/* escaper of escaper of escaper */
   RE = new RegExp( RE ) ;
   RA = ["x'!x'\"id-2",'\' "id-1 "',   "item","thing","id-3-text","class" ] ;
   alert(RA.toSource().match(RE)[1]) ;

отображает "x'!x'\"id-2".
Возможно, набег на массив, чтобы найти ВСЕ соответствия, является "чище".

/* literally (? backslash star escape quotes it!) not true, it has this one v  */
javascript:                            /* purely functional - it has no ... =! */
   RA = ["x'!x'\"id-2",'\' "id-1 "',   "item","thing","id-3-text","class" ] ;
   function findInRA(ra,id){
      ra.unshift(void 0) ;                                     /* cheat the [" */
      return ra . toSource() . match( new RegExp(
             '[^\\\\]"' + '([^"]|\\\\")*' + id + '([^"]|\\\\")*' + '[^\\\\]"' ,
             'g' ) ) ;
   }
   alert( findInRA( RA, 'id-' ) . join('\n\n') ) ;

отображается:

     "x'!x'\"id-2"

     "' \"id-1 \""

     "id-3-text"

Использование JSON.stringify():

javascript:                             /* needs prefix cleaning */
   RA = ["x'!x'\"id-2",'\' "id-1 "',   "item","thing","id-3-text","class" ] ;
   function findInRA(ra,id){
      return JSON.stringify( ra ) . match( new RegExp(
             '[^\\\\]"([^"]|\\\\")*' + id + '([^"]|\\\\")*[^\\\\]"' ,
             'g' ) ) ;
   }
   alert( findInRA( RA, 'id-' ) . join('\n\n') ) ;

отображается:

    ["x'!x'\"id-2"

    ,"' \"id-1 \""

    ,"id-3-text"

морщин:

  • "Unescaped" глобальный RegExp - это /[^\]"([^"]|\")*id-([^"]|\")*[^\]"/g с \, который можно найти буквально. Чтобы ([^"]|\")* соответствовал строкам со всеми ", экранированными как \", сам \ должен быть экранирован как ([^"]|\\")*. Если это ссылка как строка, которая будет конкатенирована с помощью id-, каждый \ должен быть снова экранирован, следовательно ([^"]|\\\\")*!
  • Поиск ID, который имеет \, *, ",..., также должен быть экранирован через .toSource() или JSON или....
  • null результаты поиска должны возвращать '' (или "" как в строке EMPTY, которая содержит NO "!) или [] (для всех поисков).
  • Если результаты поиска должны быть включены в программный код для дальнейшей обработки, необходимо eval(), например eval('['+findInRA(RA,ID).join(',')+']').

----------------------------------------------- ---------------------------------

Отступление:
Рейды и побеги? Этот код противоречит?
Семиотика, синтаксис и семантика /* it has no ... =! */ наглядно разъясняет ускорение конфликта цитируемых литералов.

Значит ли "нет =":

  • "no" = "знак", как в javascript:alert('\x3D') (не! Запустите его и убедитесь, что есть!),
  • "без оператора javascript с оператором присваивания",
  • "нет равных", как в "ничем не идентичном в любом другом коде" (предыдущие решения кода демонстрируют функциональные эквиваленты),
  • ...

Цитата на другом уровне также может быть выполнена с помощью URI протокола немедленного режима ниже. (//комментарий заканчивается на новой строке (aka nl, ctrl-J, LineFeed, ASCII decimal 10, восьмеричный 12, hex A), который требует цитирования с момента вставки nl, нажав клавишу Return, вызывает URI.)

javascript:/* a comment */  alert('visible')                                ;
javascript:// a comment ;   alert(  'not'  ) this is all comment             %0A;
javascript:// a comment %0A alert('visible but  %\0A  is wrong ')   // X     %0A
javascript:// a comment %0A alert('visible but %'+'0A is a pain to type')   ;

Примечание. Вырезать и вставить любую из строк javascript: в качестве URI немедленного режима (по крайней мере, самое большее?) в FireFox), чтобы использовать первый javascript: в качестве схемы или протокола URI, а остальные - как метки JS.

Ответ 9

let url = item.product_image_urls.filter(arr=>arr.match("homepage")!==null)

Фильтровать массив с совпадением строк. Это простой и однострочный код.

Ответ 10

Другая возможность -

var res = /!id-[^!]*/.exec("!"+windowArray.join("!"));
return res && res[0].substr(1);

что ИМО может иметь смысл, если у вас может быть специальный разделитель char (здесь я использовал "!" ), массив является постоянным или в основном постоянным (поэтому объединение может быть вычислено один или несколько раз), а полная строка isn 't намного дольше, чем искомый префикс.

Ответ 11

Здесь ваш ожидаемый фрагмент, который дает вам массив всех совпадающих значений -

var windowArray = new Array ("item","thing","id-3-text","class");

var result = [];
windowArray.forEach(val => {
  if(val && val.includes('id-')) {
    result.push(val);
  }
});

console.log(result);

Ответ 12

Я думаю, что это может помочь вам. У меня была похожая проблема. Если ваш массив выглядит так:

var array = ["page1","1973","Jimmy"]; 

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

var c; 
for (i = 0; i < array.length; i++) {
if (array[i].indexOf("page") > -1){ 
c = i;}
} 

Мы создали пустую переменную, чтобы разместить наш ответ. Затем мы перебираем массив, чтобы найти, где объект массива (например, "page1") соответствует нашему indexOf ("page"). В этом случае это 0 (первый результат)

Рад расширяться, если вам нужна дополнительная поддержка.

Ответ 13

это сработало для меня.

    const filterData = this.state.data2.filter(item=>((item.name.includes(text)) || (item.surname.includes(text)) || (item.email.includes(text)) || (item.userId === Number(text))) ) ;

Ответ 14

Используйте эту функцию для поиска подстроки Item.

function checkItem(arrayItem, searchItem) {
  return arrayItem.findIndex(element => element.includes(searchItem)) >= 0
}

function getItem(arrayItem, getItem) {
  return arrayItem.filter(element => element.includes(getItem))
}

var arrayItem = ["item","thing","id-3-text","class"];


console.log(checkItem(arrayItem, "id-"))
console.log(checkItem(arrayItem, "vivek"))
console.log(getItem(arrayItem, "id-"))