Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 确保不存在重复的目录路径_Javascript_Arrays_Json_Directory_Data Manipulation - Fatal编程技术网

Javascript 确保不存在重复的目录路径

Javascript 确保不存在重复的目录路径,javascript,arrays,json,directory,data-manipulation,Javascript,Arrays,Json,Directory,Data Manipulation,我正在编写一个脚本,其中用户选择目录,然后将目录存储在数组属性中,以便递归地对它们进行爬网 { "archives": [ "C:\\AMD\\Packages", "C:\\Users", "C:\\Windows", "D:\\", "E:\\Pictures\\Birthday" ] } 我显然不想存储重复的路径或其他路径包含的路径。例如,如果用户要选择一个新文件夹添加到数组中,E:\\Pictures,则E:\\Pictures\\bir

我正在编写一个脚本,其中用户选择目录,然后将目录存储在数组属性中,以便递归地对它们进行爬网

{
  "archives": [
    "C:\\AMD\\Packages",
    "C:\\Users",
    "C:\\Windows",
    "D:\\",
    "E:\\Pictures\\Birthday"
  ]
}
我显然不想存储重复的路径或其他路径包含的路径。例如,如果用户要选择一个新文件夹添加到数组中,
E:\\Pictures
,则
E:\\Pictures\\birth
将被丢弃并替换为它,因为
E:\\Pictures
包含
E:\\Pictures\\birth

{
  "archives": [
    "C:\\AMD\\Packages",
    "C:\\Users",
    "C:\\Windows",
    "D:\\",
    "E:\\Pictures"
  ]
}

我知道这可以通过解析所考虑的所有值(即,
['C:'、'AMD'、'Packages']、[…]、…
等)然后将它们相互比较来实现。但是,这似乎非常密集,尤其是当路径数组变大且目录路径变长时


您还可以将字符串与
includes
进行比较。例如,如果A包含B或B包含A,则将其拆分,并丢弃长度较长的

for (const dir of dirs){
  if (newPath.includes(dir) || dir.includes(newPath)){
    if (newPath.split('\\') < dir.split('\\')){
      // remove dir from json object and replace it with newPath
    }
  } else {
    pathArray.push(dir)
  }
}
for(目录的常量目录){
if(newPath.includes(dir)| dir.includes(newPath)){
if(newPath.split('\\')
在阅读了下面的一个答案后,我才意识到
includes
方法遇到了比较相似但唯一的路径的问题,即
C:\Users
C:\User



虽然一定有更好的方法来实现这一点???

此函数将为您提供所需的结果。它首先查看路径的父级是否存在于存档中,如果存在,则什么也不做。如果没有,则删除路径的所有子级,然后插入新路径

更新

我在函数中添加了一个
delim
输入,使其也可用于unix/MacOS样式的文件名

let数据={
“档案”:[
“C:\\AMD\\Packages”,
“C:\\Users”,
“C:\\Windows”,
“D:\\”,
“E:\\Pictures”
]
};
const add_to_archives=(路径、数据、delim)=>{
//此路径的父级是否已存在?如果已存在,则无需执行任何操作
如果(数据存档减少)(c,v)=>
c | | path.indexOf(v.slice(-1)==delim?v:(v+delim))==0,false))返回数据;
//找不到。请删除此路径的所有子级
data.archives=data.archives.filter(v=>v.indexOf(path.slice(-1)==delim?path:(path+delim))!==0);
//并添加新路径
数据.档案.推送(路径);
返回数据;
}
将“U”添加到“U”档案中(“E:\\Pictures\\Too”,数据“\\”;
控制台日志(数据);
将“U”添加到“U”档案中(“E:\\PicturesToo”,数据“\\”;
控制台日志(数据);
将文件添加到归档文件(“D:\\文档”,数据,\\”;
控制台日志(数据);
添加到档案中(“C:\\AMD”,数据“\\”;
控制台日志(数据);
数据={
“档案”:[
“/var/www/html/site”,
“/等”,
“/usr/tim”,
“/bin”
]
};
向档案中添加数据(“/var/www/html/site2”,数据“/”;
控制台日志(数据);
将文件添加到文件中(“/etc/conf.d”,数据“/”;
控制台日志(数据);
将“U”添加到“U档案”(“/usr”,数据“/”);
控制台日志(数据);
向档案中添加数据(“/var/www/html”,数据“/”;
控制台日志(数据)
。作为控制台包装器{
最大高度:100%!重要;

}
此功能将为您提供所需的结果。它首先查看路径的父级是否存在于存档中,如果存在,则什么也不做。如果没有,则删除路径的所有子级,然后插入新路径

更新

我在函数中添加了一个
delim
输入,使其也可用于unix/MacOS样式的文件名

let数据={
“档案”:[
“C:\\AMD\\Packages”,
“C:\\Users”,
“C:\\Windows”,
“D:\\”,
“E:\\Pictures”
]
};
const add_to_archives=(路径、数据、delim)=>{
//此路径的父级是否已存在?如果已存在,则无需执行任何操作
如果(数据存档减少)(c,v)=>
c | | path.indexOf(v.slice(-1)==delim?v:(v+delim))==0,false))返回数据;
//找不到。请删除此路径的所有子级
data.archives=data.archives.filter(v=>v.indexOf(path.slice(-1)==delim?path:(path+delim))!==0);
//并添加新路径
数据.档案.推送(路径);
返回数据;
}
将“U”添加到“U”档案中(“E:\\Pictures\\Too”,数据“\\”;
控制台日志(数据);
将“U”添加到“U”档案中(“E:\\PicturesToo”,数据“\\”;
控制台日志(数据);
将文件添加到归档文件(“D:\\文档”,数据,\\”;
控制台日志(数据);
添加到档案中(“C:\\AMD”,数据“\\”;
控制台日志(数据);
数据={
“档案”:[
“/var/www/html/site”,
“/等”,
“/usr/tim”,
“/bin”
]
};
向档案中添加数据(“/var/www/html/site2”,数据“/”;
控制台日志(数据);
将文件添加到文件中(“/etc/conf.d”,数据“/”;
控制台日志(数据);
将“U”添加到“U档案”(“/usr”,数据“/”);
控制台日志(数据);
向档案中添加数据(“/var/www/html”,数据“/”;
控制台日志(数据)
。作为控制台包装器{
最大高度:100%!重要;
}
试试这个

console.log([
“C:\\AMD\\Packages”,
“C:\\Users”,
“C:\\User”,
“E:\\Pictures”,
“E:\\图片\\生日”,
“C:\\Windows”,
“D:\\”,
“D:\\aabbcc”,
“E:\\图片\\生日”
].sort().reduce(
(acc,cur)=>
附件长度>0
&&当前起始带(附件[附件长度-1])
&&(当前索引(“\\”,acc[acc.length-1]。替换(/\\$/,“”)。长度)!=-1)
&&acc | | acc.concat(当前)
, []
))
试试这个

console.log([
“C:\\AMD\\Packages”,
“C:\\Users”,
“C:\\User”,
“E:\\Pictures”,
“E:\\图片\\生日”,
“C:\\Windows”,
“D:\\”,
“D:\\aabbcc”,
“E:\\图片\\生日”
].sort().reduce(
(acc,cur)=>
附件长度>0
&&当前起始带(附件[附件长度-1])
&&(当前索引(“\\”,acc[acc.length-1]。替换(/\\$/,“”)。长度)!=-1)
&&acc | | acc.concat(当前)
, []

))
我们可以使用

目的是为了
tree = {}
foreach path
    split the path in folders (one may iterate with substring but it is worth it?)
    try to match folders of that path while traversing the tree
    if you encounter a stop node, skip to next path
    if not, 
        if your path end on an existing node
            mark that node as a stop node
            drop the children of that node (you can let them be, though)
        else
            include the remaining folders of the path as node in tree
            mark the last node as a stop node