我试图通过关键字列表来实现过滤逻辑。如果我写了一个确切的关键字,即某个项目已经具有相同的名称,它将返回一个及多个具有new
和hotel
的关键字。
我希望我的逻辑返回名称为new hotel
的项目,但它还会返回该名称和3。然后我认为我需要按最佳匹配对返回的列表进行排序,因此具有new hotel
的项目应显示在第一个索引中。如何按最佳匹配对返回列表进行排序?
const itemList = [{
id: 23948,
name: 'Arthouse Hotel New York'
}, {
id: 1231,
name: 'Highgate Hotels new York Corperate Office'
}, {
id: 98237,
name: 'new hotel'
}, {
id: 91829371,
name: 'Smoke Gallery',
},
{
id: 1123,
name: 'Hotel Indigo Boston-Newton Riverside'
}, {
id: 919191,
name: 'Pine Cay Hotel'
}
];
const filterByValue = ['new', 'hotel'];
const nonIncludedItems = itemList.filter(property =>
filterByValue.some(
term => !property.name.toLowerCase().includes(term.toLowerCase())
)
);
const includedItems = itemList.filter(property =>
filterByValue.some(term =>
property.name.toLowerCase().includes(term.toLowerCase())
)
);
const result = includedItems.filter(i => !nonIncludedItems.includes(i));
console.log('result', result);
最佳答案
一般来说,您要尝试的是模糊搜索。为此,请查看FuseJS
一种快速而肮脏的方法是只使用string-similarity之类的东西
它接受一个字符串以针对字符串数组进行搜索...因此我们可以将您的关键字加入一个字符串中,然后搜索所有酒店名称的数组。
它将返回一个对象,该对象由“最佳匹配”组成,然后返回其余各有其各自的评分。这样,您可以简单地按额定值从最低到最高对数组进行排序,反之亦然。
检查上面链接上的文档以获取更多信息。
Stackoverflows代码段控制台未完全显示它在jsbin或codepen之类的其他游乐场中的功能,因此下面是响应的屏幕截图。
const itemList = [{
id: 23948,
name: 'Arthouse Hotel New York'
}, {
id: 1231,
name: 'Highgate Hotels new York Corperate Office'
}, {
id: 98237,
name: 'new hotel'
}, {
id: 91829371,
name: 'Smoke Gallery',
},
{
id: 1123,
name: 'Hotel Indigo Boston-Newton Riverside'
}, {
id: 919191,
name: 'Pine Cay Hotel'
}
];
const filterByValue = ['new', 'hotel'];
const names = itemList.map(hotel => hotel.name)
const bestMatch = stringSimilarity.findBestMatch(filterByValue.join(' '), names)
console.log(bestMatch)
<script src="//unpkg.com/string-similarity/umd/string-similarity.min.js"></script>
关于javascript - 按关键字数组过滤列表并按最佳匹配排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60437241/