在javascript中,如何在数组中搜索子字符串匹配

IT技术 javascript arrays search
2021-01-18 04:16:06

我需要在 javascript 中搜索一个数组。搜索将仅匹配字符串的一部分,因为该字符串将分配有附加编号。然后我需要用完整的字符串返回成功匹配的数组元素。

IE

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

我需要在其中搜索数组元素,"id-"并且我还需要提取元素中的其余文本(即。"id-3-text")。

谢谢

6个回答

如果你能使用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数组/字符串的方法,如.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'));

注意:没有 <= IE11 支持String.prototype.includes()(Edge 工作,请注意),但是您可以使用 polyfill,或者只是回退到indexOf().

@Floppy88 只需使用Object.keys(yourArrayName),它返回一个数组。你可以使用上面相同的技术来解决.filter()它。
2021-03-19 04:16:06
@Floppy88 好吧,最初的问题是在一个简单的数组中搜索;现在它也有点长了(不需要下划线。)你会搜索对象值还是键?一个示例用例会有所帮助。
2021-03-20 04:16:06
在大多数情况下,使用 .filter() 函数是最好的方法
2021-03-27 04:16:06
我需要在对象键中搜索
2021-04-01 04:16:06

这里的人让这件事太难了。只需执行以下操作...

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

findIndex()是一种 ES6 高阶方法,它遍历数组的元素并返回匹配某些条件的第一个元素的索引(作为函数提供)。在这种情况下,我使用 ES6 语法来声明高阶函数。element是函数的参数(可以是任何名称),粗箭头将后面的内容声明为匿名函数(不需要用大括号括起来,除非它占用多于一行)。

在里面,findIndex()我使用了非常简单的includes()方法来检查当前元素是否包含您想要的子字符串。

惊人的答案,正是我正在寻找的。谢谢!
2021-03-13 04:16:06
这正是我所需要的,也是一个很好的现代答案。点赞!要进一步使用,请将其分配给一个新变量,然后对它执行任何您需要的操作。例如:myArray[newVar]
2021-03-13 04:16:06
当字符串为空时会失败
2021-04-02 04:16:06

从给定数组中获取子字符串数组的最简单方法是使用 filter 并包括:

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

上面的将返回一个子字符串数组。

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

上面的将返回数组中的第一个结果元素。

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

上面的将返回数组中第一个结果元素的索引。

这将返回第一个匹配项
2021-04-04 04:16:06
@00-BBB 用过滤器替换查找
2021-04-04 04:16:06
谢谢@Hos 水星。是的,过滤器将返回列表
2021-04-04 04:16:06

在您的特定情况下,您只需使用一个无聊的旧计数器即可:

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))检查的幼稚循环这就是为什么


题外话

另一种写法

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

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

...这对您来说打字更少,也许(这一点是主观的)更容易阅读。这两个语句具有完全相同的结果:包含这些内容的新数组。

只需搜索普通旧字符串 indexOf

arr.forEach(function(a){
    if (typeof(a) == 'string' && a.indexOf('curl')>-1) {
            console.log(a);
    }        
});
如果您的数组中有混合类型,那只是不好的做法,但我还是添加了检查。
2021-03-24 04:16:06
它不适用于空值。
2021-04-02 04:16:06