我需要在javascript中搜索数组。搜索将仅匹配要匹配的字符串的一部分,因为字符串将分配给它的附加编号。然后我需要使用完整的字符串返回成功匹配的数组元素。
即
var windowArray = new Array ("item","thing","id-3-text","class");
我需要在其中搜索带有"id-"
的数组元素,我还需要拉出元素中的其余文本(即"id-3-text"
)。
由于
答案 0 :(得分:34)
如果您能够在项目中使用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:
现在这是一个非常过时的答案。也许不是大批量中性能最高的选项,但它可以更简洁地编写 lot 并使用本地ES6数组/字符串方法,如.filter()
和.includes()
:< / p>
// 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()
没有&lt; = IE11支持(Edge工作,请注意),但你可以使用polyfill,或者只是回到{{1 }}
答案 1 :(得分:13)
在你的具体情况下,你可以用一个无聊的旧柜台来做到这一点:
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))
循环; here's why
关闭-主题强>:
另一种写作方式
var windowArray = new Array ("item","thing","id-3-text","class");
是
var windowArray = ["item","thing","id-3-text","class"];
...这对你来说打字较少,也许(这一点是主观的)更容易阅读。这两个语句具有完全相同的结果:包含这些内容的新数组。
答案 2 :(得分:11)
只需搜索普通旧indexOf
arr.forEach(function(a){if (typeof(a) == 'string' && a.indexOf('curl')>-1) console.log(a);})
答案 3 :(得分:10)
这里的人们很难做到这一点。只需执行以下操作...
myArray.findIndex(element => element.includes("substring"))
findIndex()是一种ES6高阶方法,它遍历数组的元素并返回与某些条件匹配(作为函数提供)的第一个元素的索引。在这种情况下,我使用ES6语法来声明高阶函数。 element
是该函数的参数(可以是任何名称),并且粗箭头声明此后的内容为匿名函数(除非占用多于一行,否则不需要用大括号括起来)。
在findIndex()
内,我使用了非常简单的includes()
方法来检查当前元素是否包含所需的子字符串。
答案 4 :(得分:2)
有关一些替代方案及其效率的精彩研究,请参阅John Resig最近的帖子:
(讨论的问题略有不同,干草堆元素是指针的前缀,而不是相反,但大多数解决方案都很容易适应。)
答案 5 :(得分:2)
实现这一目标的最简单的vanilla 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"]
答案 6 :(得分:2)
public function store(Request $request){
$order = new Order();
$order->user_id = $request->json('user_id');
$order->item_list = $request->json('item_list');
$order->leave_note = $request->json('leave_note');
$order->total = $request->json('total');
$order->save();
$response = [
'status' => 'success',
'message' => 'order stored',
];
return response()->json($response);
}
这将返回数组中的实际元素。
myArray.find(element => element.includes("substring"));
这将返回数组中元素的索引。
答案 7 :(得分:1)
REF: In javascript, how do you search an array for a substring match
此处给出的解决方案与solution 4556343#4556343不同,它需要先前的解析来识别与join()
一起使用的字符串,该字符串不是任何数组字符串的组成部分。
此外,代码/!id-[^!]*/
更准确,/![^!]*id-[^!]*/
以适应问题参数:
... 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"
皱纹:
/[^\]"([^"]|\")*id-([^"]|\")*[^\]"/g
,\
字面意义。为了使([^"]|\")*
匹配所有"
转义为\"
的字符串,\
本身必须转义为([^"]|\\")*
。如果将此引用为要与id-
连接的字符串,则必须再次转义每个\
,因此([^"]|\\\\")*
!ID
,\
,*
,...的搜索"
也必须通过.toSource()
或{{1}转义或......。JSON
搜索结果应返回null
(或''
,如EMPTY字符串中包含NO ""
!)或"
(适用于所有搜索) []
,例如eval()
。题外话:
袭击和逃跑?这段代码是否有冲突?
eval('['+findInRA(RA,ID).join(',')+']')
的符号学,语法和语义着重阐明了引用文字冲突的逃避。
“no =”是否意味着:
/* it has no ... =! */
(不!运行它,看看有!),另一个级别的引用也可以使用下面的立即模式javascript协议URI来完成。 (//注释结束于新行(又名nl,ctrl-J,LineFeed,ASCII十进制10,八进制12,十六进制A),需要引用,因为插入一个nl,通过按Return键调用URI。)
javascript:alert('\x3D')
注意:剪切并粘贴任何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') ;
行作为立即模式URI(至少在FireFox中至少?),以使用第一个javascript:
作为URI方案或协议,其余作为JS标签。
答案 8 :(得分:1)
我创建了一个易于使用的库(ss-search),该库旨在处理对象,但在您的情况下也可以使用:
search(windowArray.map(x => ({ key: x }), ["key"], "SEARCH_TEXT").map(x => x.key)
使用此搜索功能的优势在于,它将在执行搜索之前将文本标准化以返回更准确的结果。
答案 9 :(得分:0)
另一种可能性是
var res = /!id-[^!]*/.exec("!"+windowArray.join("!"));
return res && res[0].substr(1);
如果你有一个特殊的字符分隔符(这里我使用“!”),那么IMO可能有意义,数组是常量或大多数常量(因此连接可以计算一次或很少)并且完整的字符串不是比搜索的前缀长得多。
答案 10 :(得分:0)
这是您期望的摘录,其中包含所有匹配值的数组-
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);
答案 11 :(得分:0)
let url = item.product_image_urls.filter(arr=>arr.match("homepage")!==null)
具有字符串匹配项的过滤器数组。这很简单,只需一行代码。
答案 12 :(得分:0)
我认为这可能会对您有所帮助。我有一个类似的问题。如果您的数组如下所示:
var array = ["page1","1973","Jimmy"];
您可以执行简单的“ for”循环,以在匹配时返回数组中的实例。
var c;
for (i = 0; i < array.length; i++) {
if (array[i].indexOf("page") > -1){
c = i;}
}
我们创建一个空变量c来存放我们的答案。 然后,我们遍历数组以查找数组对象(例如“ page1”)与我们的indexOf(“ page”)相匹配的位置。在这种情况下,它是0(第一个结果)
如果需要进一步的支持,很乐意扩展。
答案 13 :(得分:0)
这对我有用。
const filterData = this.state.data2.filter(item=>((item.name.includes(text)) || (item.surname.includes(text)) || (item.email.includes(text)) || (item.userId === Number(text))) ) ;
答案 14 :(得分:0)
使用此功能搜索子字符串项。
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-"))