【发布时间】:2020-02-21 11:04:05
【问题描述】:
我正在编写一个脚本,其中用户选择目录,然后将其存储在数组属性中,以便可以递归地抓取它们。
{
"archives": [
"C:\\AMD\\Packages",
"C:\\Users",
"C:\\Windows",
"D:\\",
"E:\\Pictures\\Birthday"
]
}
我显然不想存储重复路径或其他路径包含的路径。例如,如果用户要选择一个新文件夹来添加到数组中,E:\\Pictures,那么E:\\Pictures\\Birthday 将被丢弃并被它替换,因为E:\\Pictures 包含E:\\Pictures\\Birthday。
{
"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)
}
}
阅读下面的答案之一后,我才意识到includes 方法遇到了比较相似但独特的路径的问题,即C:\Users 和C:\User。
虽然必须有更好的方法来做到这一点??
【问题讨论】:
-
在您的示例中,数组
archives按字母顺序排序。这个假设正确吗? -
@user753642 是的,在示例中它是按字母顺序排列的,但不一定非要如此。我只关心不添加任何“重复”路径
标签: javascript arrays json directory data-manipulation