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

我有一个版本的数组:

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); } }); } }); 

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

1)取文件的后缀。 我采取的定义是'和_之间的非数字string。 在文件格式的3个字母之前。 您可能需要另一个定义或做一些检查。
但是我认为如果文件名的其他部分包含匹配的string,那么手头的后缀是一个好的开始,以避免意外的发生。

 // 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); } 

我相信你想要这个:

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

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

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

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