使用lodash或类似的库,如何按最接近的结果对集合进行排序?

时间:2017-05-26 12:31:05

标签: javascript json sorting lodash

我有一个对象数组,我根据用户输入过滤这些对象。现在我想做的是通过最接近的匹配对对象进行排序。

_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,则显示所有三个结果,这很好,但我想按名称进行最接近匹配对这些结果进行排序。所以结果将按顺序排列: Mars, Summa, Guide

我想这个过程将是:

1)按字母顺序排列(可选)

2)根据字符串

的子串距离对“别名”进行排序

3)按字符串开头的子串距离

对“名称”进行排序

1 个答案:

答案 0 :(得分:0)

我能够自己解决这个问题。解决方案非常简单。

我最终关心别名,发现名字排序很多。对别名进行排序增加了我的计算复杂度,在我的用例中,实际上没有任何收益。

sortResults = (data, input) => {
  _.sortBy(data, [
    ({ name }) => {
      const index = name.indexOf(input);
      return index === -1 ? Number.MAX_SAFE_INTEGER : index;
    }
  ]);
};