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
)
...
或类似。
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}
这不是最佳的,但您可以随时修改它。
添加回答
举报