JavaScript:如何检查字符串是否包含数组中的值?

JavaScript:如何检查字符串是否包含数组中的值?,javascript,node.js,Javascript,Node.js,我有一系列版本: var versions = ['xs', 'sm', 'md', 'lg', 'thumbnail']; 我想获取存储在这个数组中的所有图像,这些图像不包含任何后缀。以下是图像阵列的示例: { "files": [ "/public/uploads/contentitems/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0_1.png",

我有一系列版本:

var versions = ['xs', 'sm', 'md', 'lg', 'thumbnail'];
我想获取存储在这个数组中的所有图像,这些图像不包含任何后缀。以下是图像阵列的示例:

{
    "files": [
        "/public/uploads/contentitems/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0_1.png",
        "/public/uploads/contentitems/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0_1_xs.png",
        "/public/uploads/contentitems/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0_1_sm.png",
        "/public/uploads/contentitems/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0_1_md.png",
        "/public/uploads/contentitems/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0_1_lg.png",
        "/public/uploads/contentitems/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0_1_thumbnail.png"
    ]
}
我只想要第一个项目,但是,我用我当前的代码获得了所有项目:

fs.stat(file, function(err, stat) {
    if (stat && stat.isDirectory()) {
        // perform directory code here
    } else {
        versions.forEach(function(version) {
            if (file.indexOf(version) != -1) {
                results.push(file);
            }
        });
    }
});

我相信你想要这个:

if (file.indexOf(version) == -1) {
    results.push(file);
}

如果文件名包含后缀,
file.indexOf(version)
将返回索引>-1,因此您不想将其添加到结果中。但是,如果文件名不包含后缀,该行将返回-1。

我将这样做:

1) 取文件的后缀。我采用的定义是“介于uu和之间的非数字字符串”。在文件格式的3个字母之前。您可能需要另一个定义或进行一些检查。
但我认为,如果文件名的其他部分包含匹配的字符串,那么使用后缀可以避免意外,这是一个很好的开始

// provides lower case suffix of the file, or null if none found.
function getSuffix (s) { 
         var res = /_([a-zA-Z]+)\.\w{3}$/g.exec(s) ;
         if (!res) return null;
         return res[1].toLowerCase();
} 
2) 编写如下可用格式:

var version = { xs : true, sm : true, md : true, lg : true, thumbnail : true } ;
3) 然后通过以下方式完成检查:

var suffix = getSuffix(fileName) ;
if (version[suffix]) /* do something */

(请注意,通过这种方式,您可以轻松地将函数与格式关联:

var versionProcessors = { xs : function(fileBuffer) { /* process a xs buffer */ }, 
                          sm : function(fileBuffer) ...,
                   .      .. } ;

// ... later ....
var suffix = getSuffix(fileName) ;
var processor = versionProcessors[suffix]; 
if (processor) {
      getFileBuffer(fileName, processor);
}

)

以下是我的做法:

var versions = ['xs', 'sm', 'md', 'lg', 'thumbnail'];
results=[];
files=[
    "/public/uploads/contentitems/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0_1.png",
    "/public/uploads/contentitems/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0_1_xs.png",
    "/public/uploads/contentitems/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0_1_sm.png",
    "/public/uploads/contentitems/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0_1_md.png",
    "/public/uploads/contentitems/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0_1_lg.png",
    "/public/uploads/contentitems/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0_1_thumbnail.png"
]
files.forEach(function (file){
    //start checking
    findany=false;
    versions.forEach(function(version) {
        if (file.indexOf(version) != -1) findany=true;
    });
    if(!findany) results.push(file);
    //end checking
})
输出

> results
[ '/public/uploads/contentitems/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0/063012A5-60BC-4A4C-AEC2-56B0D5D99EF0_1.png' ]

底部代码中的
versions
是否与顶部名为
version
的数组相同?如果您只需要第一项,为什么不使用“return”停止forEach循环?我相信他是说他只想要第一项,因为第一个文件名是唯一一个在
版本中不包含后缀的文件名。请使用some()而不是forEach(),并返回true以停止迭代。逻辑中有问题。您的
版本.forEach
将推送该文件,除非文件名中出现所有版本。这也是错误的。为什么?如果文件名包含一个版本,并且您与另一个版本匹配,它将推送该文件名。