繁体   English   中英

一种检查值是否包含在Javascript数组(而不是整个对象)中的干净方法

[英]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文档中找到更多信息。

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array#Iteration_methods

因此,您有一些选择。 如果只需要添加对象(如果该对象不存在):

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM