首页 > 解决方案 > 我需要一种好方法来从javascript中的数组中对每个类别中的文件名进行分类,但是当没有将匹配项放入一般组时

问题描述

基本上,我有两个数组,一个是文件的类型,另一个是实际的文件名,所以,我需要验证每个文件名并搜索一个特定的字符串,然后,分组,但有一些规则,例如,对于新版本文件,该组必须按顺序名称 ASC 并且一般必须具有与类型不匹配的那些和具有其中类型的那些。(我需要使用纯 Javascript 来执行此操作)示例:

types: ["general","picture","document","annotation"]
files: [
         {name:"-t_picture_t-my_vacation.jpg"},
         {name:"-t_document_t-my_curriculum.pdf"},
         {name:"my_favorite_music.mp3"},
         {name:"my_dance_video.mp4"},
         {name:"-t_annotation_t-dont_forget.txt"},
       ]

预期的结果是这样的:

[
 {name:"my_dance_video.mp4"},
 {name:"my_favorite_music.mp3"},
 {name:"-t_picture_t-my_vacation.jpg"},
 {name:"-t_document_t-my_curriculum.pdf"},
 {name:"-t_annotation_t-dont_forget.txt"},
]

有任何问题,只需留言即可。

标签: javascriptarrayssorting

解决方案


嗯......一个简单的算法将是这样的

const types = ["picture","document","annotation", "general"]
const files = [
         {name:"-t_picture_t-my_vacation.jpg"},
         {name:"-t_document_t-my_curriculum.pdf"},
         {name:"my_favorite_music.mp3"},
         {name:"my_dance_video.mp4"},
         {name:"-t_annotation_t-dont_forget.txt"},
       ]
       
const result = []
const matches = {}

for (const file of files) {
    for (const type of types) {
        if (file.name.includes(type)) {
          result.push(file)
          matches[file.name] = true
        } else if (type == 'general' && !matches[file.name]) {
            result.unshift(file)
        }
    }
}

console.log(result)

缺点是我们需要等待general类别直到最后,因为只有当我们完成排序后,我们才能添加其余项目而不会重复

希望这有助于您启动解决方案。享受


推荐阅读