refsort
Version:
Lets you sort by key values for JSON
65 lines (52 loc) • 2.08 kB
JavaScript
module.exports = Array.prototype.refSort = function (key, value) {
const characterCounter = (string, char) => {
return string.split(char).length - 1
}
const prioritization = (key, val) => {
let valUpper = val.toUpperCase()
let valArray = valUpper.split('')
let keyUpper = key.toUpperCase()
let score = 0
valArray.forEach(char => (score = score + characterCounter(keyUpper, char)))
return score
}
const convertString = phrase => {
const maxLength = 100
let returnString = phrase.toLowerCase()
returnString = returnString.replace(/ö/g, 'o')
returnString = returnString.replace(/ç/g, 'c')
returnString = returnString.replace(/ş/g, 's')
returnString = returnString.replace(/ı/g, 'i')
returnString = returnString.replace(/ğ/g, 'g')
returnString = returnString.replace(/ü/g, 'u')
returnString = returnString.replace(/[^a-z0-9s-]/g, '')
returnString = returnString.replace(/[s-]+/g, ' ')
returnString = returnString.replace(/^s+|s+$/g, '')
if (returnString.length > maxLength)
returnString = returnString.substring(0, maxLength)
returnString = returnString.replace(/s/g, '-')
return returnString
}
let newObj = []
this.forEach(val => {
let _key = convertString(val[key]).toUpperCase()
let _val = convertString(value).toUpperCase()
val.score = prioritization(_key, _val)
let indexOf = _key.indexOf(_val)
val._priority = ((val.score + indexOf) * val.score) / 100
val._index = indexOf === -1 ? NaN : indexOf
val._include = _key.includes(_val)
delete val.score
newObj.push(val)
})
newObj = newObj
.sort((a, b) => b._priority - a._priority)
.sort((a, b) => b._include - a._include)
.sort((a, b) => a._index - b._index)
newObj.forEach(char => {
delete char._priority
delete char._include
delete char._index
})
return newObj
}