我有一个对象数组,我正在根据用户输入过滤这些对象。现在我想做的是按最接近的匹配对对象进行排序。
_internalSearch = (input) => {
const { data } = this.props;
const filteredData = _.filter(data, (collection) => {
const subCollection = _.pick(collection, ["name", "alias"];
return _.includes(
subCollection.toString().toLowerCase(),
input.toString().toLowerCase()
);
});
//psudo code:
/**
return _.sortBy( items-by-closest-matching-search )
*/
}
数据看起来像这样:
[
{
"id": 2,
"name": "Guide",
"url": "http://gify.net",
"alias": "Maps"
},
{
"id": 0,
"name": "Summa",
"alias": "Fun Town"
},
{
"id": 1,
"name": "Mars",
"url": "https://funstuff.org",
"alias": "Dentist"
}
]
现在,如果输入是 ma
所有三个结果都会显示,这很好,但我想按名称最接近匹配对这些结果进行排序。所以结果将按以下顺序排列:
火星,苏玛,指南
我猜这个过程是:
1) 按字母顺序排序(可选)
2) 按子字符串与字符串开头的距离对“别名”进行排序
3) 按子字符串与字符串开头的距离对“名称”进行排序
最佳答案
我自己已经弄清楚了。解决方案非常简单。
我最终对别名进行了排序,发现按名称排序就足够了。对别名进行排序增加了我的计算复杂性,在我的用例中,实际上没有任何好处。
sortResults = (data, input) => {
_.sortBy(data, [
({ name }) => {
const index = name.indexOf(input);
return index === -1 ? Number.MAX_SAFE_INTEGER : index;
}
]);
};
关于javascript - 使用 lodash 或类似的库,如何按最接近的结果对集合进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44201698/