2017-05-26 47 views
1

我有一個對象數組,我正在過濾我們這些基於用戶輸入的對象。現在我想要做的是通過最匹配的方式對對象進行排序。使用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)排序的「別名」從啓動子的距離從字符串

+1

對於#2和#3您可以使用levenshtein距離.. – 2017-05-26 12:35:09

回答

0

的啓動子的距離串

3)排序的「名」我能找出自己。解決方案非常簡單。

我最終關心對別名進行排序,發現對名稱排序很多。按照別名排序增加了我的計算複雜度,在我的使用情況下,幾乎沒有增益。

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