'a'
mh-two-thousand-and-two
2024-04-12 44d2c92345cd156a59fc327b3060292a282d2893
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
var filter = require('./filter');
var map = require('./map');
var isStr = require('./isStr');
var safeGet = require('./safeGet');
var levenshtein = require('./levenshtein');
var pluck = require('./pluck');
exports = function(needle, haystacks) {
    var options =
        arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
    if (!options.caseSensitive) {
        needle = needle.toLowerCase();
    }
    haystacks = map(haystacks, function(haystack) {
        var string = toStr(haystack, options);
        if (!options.caseSensitive) {
            string = string.toLowerCase();
        }
        return {
            value: haystack,
            levenshtein: levenshtein(needle, string),
            string: string
        };
    });
    haystacks = filter(haystacks, function(haystack) {
        return hasAllLetters(needle, haystack.string, options);
    });
    haystacks.sort(function(a, b) {
        return a.levenshtein - b.levenshtein;
    });
    return pluck(haystacks, 'value');
};
function toStr(haystack, options) {
    if (isStr(haystack)) return haystack;
    return safeGet(haystack, options.key) || '';
}
function hasAllLetters(needle, haystack) {
    var hLen = haystack.length;
    var nLen = needle.length;
    if (nLen > hLen) return false;
    if (nLen === hLen) return needle === haystack;
    for (var i = 0, j = 0; i < nLen; i++) {
        var c = needle.charCodeAt(i);
        var has = false;
        while (j < hLen) {
            if (haystack.charCodeAt(j++) === c) {
                has = true;
                break;
            }
        }
        if (!has) return false;
    }
    return true;
}
 
module.exports = exports;