为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

侃侃尔雅 2021-12-02 14:54:37
原谅标题,但基本上这就是我想要做的:我有一个对象数组,在这个例子中我们称它们为狗。每个对象看起来像这样:    {        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]]这听起来像是最好的方法,还是有更简单/更好的方法?
查看完整描述

2 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

不,这听起来不是最好的方法,因为您正在保存本质上是数组结构中的对象的东西。更好的方法是将结果对象数组作为结果。


使用以下代码段,您将获得一个对象数组,其中包含狗名和所有匹配的关键字。


您可以轻松地从中获取匹配的关键字数量(通过使用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

)

...

或类似。


查看完整回答
反对 回复 2021-12-02
?
茅侃侃

TA贡献1842条经验 获得超21个赞

您可以根据自己的意愿生成分数:


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}

这不是最佳的,但您可以随时修改它。


查看完整回答
反对 回复 2021-12-02
  • 2 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信