Last active
May 25, 2018 01:22
-
-
Save ChangJoo-Park/8859827105b473cc8a62d891f36d0d82 to your computer and use it in GitHub Desktop.
Score Iterator
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 같으면 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