В javascript, как искать массив для подстроки
Мне нужно найти массив в javascript. Поиск будет состоять только в том, что только часть строки соответствует тому, что строка будет иметь дополнительные номера, назначенные ей. Затем мне нужно было бы возвратить успешно подобранный элемент массива с полной строкой.
то есть.
var windowArray = new Array ("item","thing","id-3-text","class");
Мне нужно найти элемент массива с "id-"
в нем, и мне нужно также вытянуть остальную часть текста в элементе (т.е. "id-3-text"
).
Спасибо
Ответы
Ответ 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-"))