[英]Clean way to check if a value is contained within a Javascript Array (not the entire object)
基本上,我有一个文件数组(包括文件名和路径等),我试图查看数组中是否已经存在具有相同路径名的文件(即使其他变量不同)。
如果在该数组中找到该值,我想继续,如果没有,我想将该对象添加到该数组中。 allFiles.length
我带来麻烦的是,数组最初是空的(因此我什至在没有检查allFiles.length
情况下也无法第一次运行我的检查功能)。
我正在做的是遍历整个数组,如果我发现数组中包含的值,则将Boolean设置为true
,然后继续使用if...else
我以为这很简单,但我想我错了。 我想出了这种方法,我想知道是否有一种更清洁的方法。
var allFiles = [];
//function is called giving me a file, then:
if (!allFiles.length) {
allFiles.push(file); //Seems like there should be a better way
} else {
for (var i = 0; i < allFiles.length; i += 1) {
var exists = false;
if (allFiles[i]['fileName'] == fileName) {
exists = true;
console.log('Already exists');
break;
}
}
if (exists) {
console.log('Remove the file');
exists = false;
} else {
console.log('Adding File');
allFiles.push(file);
}
}
也许这很干净,我只是想知道您是否知道其他路线。 谢谢
您可以使用Array.some
来测试给定路径的存在:
var objs = [{name: 'foo', path: 'c:\lulz'}, {name: 'foo', path: 'c:\looolz'}];
var conditionallyAddObjToArr = function (arr, obj) {
if (!arr.some(function (_obj) { return obj.path === _obj.path; })) {
return [].concat(arr, obj);
} else {
console.log('path is already present', obj.path);
return arr;
}
}
objs = conditionallyAddObjToArr(objs, {name: 'baz', path: 'c:\wat'}); // will be added
objs = conditionallyAddObjToArr(objs, {name: 'baz', path: 'c:\lulz'}); // won't be added
现在,您几乎可以使用所有出色的ECMA 5阵列迭代方法。 它们仅限于IE9 +,但是如果您真的想在mozilla文档中找到更多信息。
因此,您有一些选择。 如果只需要添加对象(如果该对象不存在):
if (!allFiles.some(function(f){ return f.filename===filename}))
allFiles.push(file);
如果您需要对文件进行某些操作,则可以仅提取索引:
var idx = allFiles.reduce(function(m,f,idx) {
return m || (f.filename===filename ? idx : null)
},null);
if (var foundFile = allFiles[idx]) { ... }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.