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
将推送该文件,除非文件名中出现所有版本。这也是错误的。为什么?如果文件名包含一个版本,并且您与另一个版本匹配,它将推送该文件名。