Skip to content

Commit

Permalink
Add support for comparing case-sensitive
Browse files Browse the repository at this point in the history
Closes GH-6.
  • Loading branch information
wooorm committed Nov 14, 2019
1 parent ade1f77 commit a9f87ca
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 6 deletions.
20 changes: 14 additions & 6 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,18 @@ var levenshtein = require('levenshtein-edit-distance')

module.exports = similarity

function similarity(a, b) {
if (!a || !b || a.length === 0 || b.length === 0) return 0
if (a === b) return 1
var d = levenshtein(a.toLowerCase(), b.toLowerCase())
var longest = Math.max(a.length, b.length)
return (longest - d) / longest
function similarity(a, b, options) {
var opts = options || {}
var sensitive = opts.sensitive
var left = casing(a || '', sensitive)
var right = casing(b || '', sensitive)
if (left.length === 0 || right.length === 0) return 0
if (left === right) return 1
var distance = levenshtein(left, right)
var longest = Math.max(left.length, right.length)
return (longest - distance) / longest
}

function casing(value, sensitive) {
return sensitive ? value : value.toLowerCase()
}
10 changes: 10 additions & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,16 @@ similarity('es6-shim', 'es6 shim') // 0.875
similarity('ES6-Shim', 'es6 shim') // 0.875 (case insensitive)
```

## API

### `similarity(left, right[, options])`

Get the similarity (`number`) between two values (`string`s),
where `0` is dissimilar, and `1` is equal.

* `options.sensitive` (`boolean`, default: `false`)
— Turn on (`true`) to treat casing differences as differences

## See also

Note: This module uses [Levenshtein distance][wiki] to measure similarity, but
Expand Down
5 changes: 5 additions & 0 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,10 @@ test('similarity', function(t) {
t.equal(similarity('chicken', 'chick'), 5 / 7)
t.equal(similarity('es6-shim', 'es6 shim'), 7 / 8)
t.equal(similarity('ES6 Shim', 'es6-shim'), 7 / 8, 'case insensitive')
t.equal(
similarity('ES6 Shim', 'es6-shim', {sensitive: true}),
4 / 8,
'case sensitive'
)
t.end()
})

0 comments on commit a9f87ca

Please sign in to comment.