将字符串与 JSON 值进行比较?

问题描述 投票:0回答:1

我有一个传入的文件名,我希望能够收集有用的信息并将其传递给用户。

文件名将类似于:XYZStatsSyllabus2023.docx

我正在尝试分析传入的文件名,以找出 1) 它可能属于哪个类以及 2) 它可能是什么文档类型。

我有一个包含大约 150 个类的 JSON 文件,每个类都有一个短名称(例如:Stats)作为键、一个长名称(例如:Statistics)、一个课程代码(例如:MT105)和一个首字母缩略词(例如:统计)。 JSON信息如下所示。

{
    "Course":{
        "Stats":{
            "name": "Statistics",
            "code": "MT105",
            "acronym": "STAT"
        },
        "Lit":{
            "name": "Literature",
            "code": "EN102",
            "acronym" : "LITR"
        },
        "Hist":{
            "name": "History",
            "code": "HT101",
            "acronym": "HIST"
        }, 
        "Gov":{
            "name": "Government",
            "code": "PS101",
            "acronym": "GOVT"
        }
    }
}

文件名中包含的信息将始终包含三个条目之一。我希望能够对文件名进行正则表达式,以查看它是否与任何名称、代码或首字母缩略词匹配,如果匹配,那么我希望能够将全部课程信息的密钥传递给用户。如果文件名包含 MT105,我想告诉用户它属于“Stats”,如果包含“History”,我想返回“Hist”。

我有迭代像“Course”这样的对象,然后选择一个匹配并迭代它的经验,但是当我本质上需要迭代“Course”时,我将如何将字符串与 JSON 匹配,然后我必须遍历其子项,如果找到匹配项,则返回键值。当然必须有更好的方法吗?

我尝试迭代“课程”,然后迭代每个孩子的孩子。这是一种非常迂回的方法,但并不总是有效。

javascript json object
1个回答
0
投票

这是一个函数,您可以为其指定一个文件名。它尝试找到一个课程,其中某些给定的属性名称值包含在文件名中。

const data = {
    "Course":{
        "Stats":{
            "name": "Statistics",
            "code": "MT105",
            "acronym": "STAT"
        },
        "Lit":{
            "name": "Literature",
            "code": "EN102",
            "acronym" : "LITR"
        },
        "Hist":{
            "name": "History",
            "code": "HT101",
            "acronym": "HIST"
        }, 
        "Gov":{
            "name": "Government",
            "code": "PS101",
            "acronym": "GOVT"
        }
    }
};


// hint. If you define courses as an array instead of an object you don't have to do the following nonsense when you want to iterate it or use array functions on it
const courses = Object.entries(data.Course).map(([key, value]) => ({key, ...value}));

const keys = ['key', 'name', 'code', 'acronym'];

const whichCourse = (fileName) => {
  let f = fileName.toLowerCase();
  return courses.find(c => 
    keys.some(k =>
      f.includes(c[k].toLowerCase())
    )
  );
}

let sampleFileName = "hist101";

let output = whichCourse(sampleFileName);

console.log(output);
console.log(output.key);

© www.soinside.com 2019 - 2024. All rights reserved.