从对象数组中选择,通过匹配其中的一个属性,它也是一个数组

原谅标题,但基本上这就是我想要做的:


我有一个对象数组,在这个例子中我们称它们为狗。每个对象看起来像这样:


    {

        name: "Poodle",

        keywords: ["Fluffy", "Intelligent", "Hypo-allergenic", "Loyal"]

    }

用户选择三个词,然后我想搜索对象数组,并将这三个词与每个数组的 'keywords' 属性进行匹配。然后我有一些显示逻辑:

  • 如果狗与用户选择的所有三个词都匹配,我只想返回那只狗。

  • 如果只有匹配 2 个词的狗,那么我最多想带 2 只这些狗。

  • 如果只有一个 2 字狗,然后有多个 1 狗匹配,则只显示 2 字狗。

  • 如果只有 1 个单词的狗匹配项,则最多显示其中的三个。

基本上,我不是在问如何做要点,我可以弄清楚,但理想情况下,我需要一组狗和每个狗旁边的匹配数。然后我可以对此进行一些过滤。

所以我需要一个狗名数组,匹配总数,像这样的东西(当然,除非有更好的方法,然后我全神贯注):

[

  ["Poodle", 2],

  ["Labrador", 2],

  ["Schpitz", 1],

  ["Setter", 0],

  ["Pit Bull", 0]

]

这听起来像是最好的方法,还是有更简单/更好的方法?


侃侃尔雅
浏览 187回答 2
2回答

浮云间

不,这听起来不是最好的方法,因为您正在保存本质上是数组结构中的对象的东西。更好的方法是将结果对象数组作为结果。使用以下代码段,您将获得一个对象数组,其中包含狗名和所有匹配的关键字。您可以轻松地从中获取匹配的关键字数量(通过使用result[i].matched.length),但我认为这更实用,因为您还可以显示实际匹配的关键字。const data = [  {    name: "Poodle",    keywords: ["Fluffy", "Intelligent", "Hypo-allergenic", "Loyal"]  },  {    name: "Husky",    keywords: ["Fluffy", "Cute", "Stuff", "IdkMuchAboutDogs"]  }];const keywords = ["Fluffy", "Cute", "Intelligent"];const result = data.map(dog => {  return {    dog: dog.name,    matches: keywords.filter(keyword => dog.keywords.indexOf(keyword) !== -1)  };});console.log(result);如果你想在关键字比较上有更多的逻辑,你需要做类似的事情...matches: keywords.filter(keyword =>    dog.keywords.filter(dogkeyword =>       // Now you can compare those two keywords with more complex algorithms      dogkeyword.toLowerCase() == keyword.toLowerCase()   ).length !== 0)...或类似。

茅侃侃

您可以根据自己的意愿生成分数:let dogs = [    {        name: "Poodle",        keywords: ["Fluffy", "Intelligent", "Hypo-allergenic", "Loyal"]    },    {        name: "Dog2",        keywords: ["Fluffy", "Intelligent", "Hypo-allergenic",]    },    {        name: "Dog3",        keywords: ["Fluffy"]    }]计分:let scored = words => dogs.map(dog => {    // you can add modification for 2 words term    let score = dog.keywords.filter(kw => words.includes(kw)).length    return {        name: dog.name,        score    }})然后按最佳成绩排序:let sorted = dogs => dogs.sort((a,b) => b.score - a.score)console.log(sorted(scored(['Fluffy', 'Loyal', "Intelligent"]))){name: "Poodle", score: 3}{name: "Dog2", score: 2}{name: "Dog3", score: 1}这不是最佳的,但您可以随时修改它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript