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

时间:2013-12-17 23:36:04

标签: 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",
        "/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);
            }
        });
    }
});

3 个答案:

答案 0 :(得分:1)

以下是我将如何做到这一点:

1)取文件的后缀。我采用的定义是'和_之间的非数字字符串。在文件格式的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);
}

答案 1 :(得分:0)

我相信你想要这个:

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

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

答案 2 :(得分:0)

我将如何做到这一点:

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' ]