基本上我有一个文件数组(包括文件名和路径等),我试图查看数组中是否已存在具有相同路径名的文件(即使其他变量不同)。
如果在该数组中找到值,我想继续前进,如果不是,我想将该对象添加到数组中。同样给我带来麻烦的是,数组最初是空的(所以我甚至不能在没有检查allFiles.length
的情况下第一次运行我的检查功能。)
我正在做的是循环遍历整个数组,如果我找到数组中包含的值,则设置布尔值为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);
}
}
也许这很干净,我只是想知道你是否知道不同的路线。感谢
答案 0 :(得分:1)
您可以使用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
答案 1 :(得分:1)
现在你可以使用所有酷的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]) { ... }