Skip to content

Instantly share code, notes, and snippets.

@ChangJoo-Park
Last active May 25, 2018 01:22
Show Gist options
  • Save ChangJoo-Park/8859827105b473cc8a62d891f36d0d82 to your computer and use it in GitHub Desktop.
Save ChangJoo-Park/8859827105b473cc8a62d891f36d0d82 to your computer and use it in GitHub Desktop.
Score Iterator
/**
* 같으면 0, 다르면 1
* @param (숫자) left
* @param (숫자) right
*/
function scoreNumbers(left, right) {
return left == right ? 0 : 1
}
/**
* 같으면 0, 다르면 1
* @param (문자열) left
* @param (문자열) right
*/
function scoreStrings(left, right) {
return Math.abs(left.localeCompare(right))
}
/**
* 같으면 0, 다르면 1
* @param (Boolean) left
* @param (Boolean) right
*/
function scoreBoolean(left, right) {
return left === right ? 0 : 1
}
function doScore (left, right) {
switch (typeof left) {
case 'number':
case Number:
return scoreNumbers(left, right)
break
case 'string':
case String:
return scoreStrings(left, right)
break
case 'boolean':
case Boolean:
return scoreBoolean(left, right)
break
}
}
/**
* 서로 다른 두 데이터를 연속해서 비교하여 가중치를 구하는 Iterator
* 다를수록 점수가 높아짐
*/
function makeIterator(array) {
let nextIndex = 0
let score = 0
return {
next () {
if (nextIndex >= array.length) return { done: true }
const { left, right } = array[nextIndex++]
if (typeof left != typeof right) return { done: true }
const value = doScore(left, right)
score += value
return { value, done: false }
},
getScore () { return score }
}
}
function main () {
const objectA = {
number: 1,
string: '1',
boolean: true
}
const objectB = {
number: 2,
string: '2',
boolean: false
}
const array = []
Object.keys(objectA).forEach(key => {
array.push({ left: objectA[key], right: objectB[key] })
})
let score = 0
const iterator = makeIterator(array)
while (true) {
const { done } = iterator.next()
if (done) {
score = iterator.getScore()
break;
}
}
console.log(score)
}
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment