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

标签 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 所有三个结果都会显示,这很好,但我想按名称最接近匹配对这些结果进行排序。所以结果将按以下顺序排列: 火星,苏玛,指南

我猜这个过程是:

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/

相关文章:

javascript - 如何使用 jQuery/javascript 检索元素的类?

javascript - 填充动画延迟

json - _TypeError(类型 'List<dynamic>'不是类型 'Map<String, dynamic>'的子类型)

c# - wpf 以编程方式设置排序,以便将标题切换为已排序

php - 数组按日期排序

javascript - 如何更改 Semantic-UI React 的选项卡标题宽度(垂直选项卡)

javascript - PHP:响应 AJAX post 请求

ios - "The data couldn’ t be read because it is missing”在Swift中解码JSON时出错

algorithm - 是否可以在 O(N) 中重新排列数组?

javascript - 如何将函数变成 jQuery 插件