Last active
April 26, 2021 18:11
-
-
Save jjori-master/c6837fbf32f5390a9ed183750bdaf934 to your computer and use it in GitHub Desktop.
This file contains 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
if (1) { | |
// 1번과제 [1, 2, 3, 4, 5, 6, 7].filter(it=> it%2).map(it=>it*2) 7회로 해결하기 입니다. | |
let cnt = 0; | |
const generator = function* (arr) { | |
for (let i = 0; i < arr.length; i++) { | |
cnt++; | |
if (arr[i] % 2) { | |
yield arr[i] * 2; | |
} | |
} | |
}; | |
const [...res] = generator([1, 2, 3, 4, 5, 6, 7]); | |
console.log(res); | |
console.log(cnt); | |
} | |
if (1) { | |
// 2번 과제 | |
// https://gist.github.com/hikaMaeng/3944b4b75bf8a42f4814de0e8bb56e1d | |
// 미완 코드 완성하기 | |
// 거의 유투브를 보며.. 보고 그대로 쳤네요 ㅠ | |
const stringCheck = [ | |
[/[\r\n\l]/g, "\\n"], | |
[/"/g, '\\"', [/\t/g, "\\t"]], | |
]; | |
const el = { | |
number: (v) => v.toString(), | |
boolean: (v) => v.toString(), | |
string: (v) => { | |
for (let i = 0; i < stringCheck.length; i++) { | |
v = v.replace(stringCheck[0], stringCheck[1]); | |
} | |
return v; | |
}, | |
stringify(v) { | |
return this[typeof v]?.(v) ?? "null"; | |
}, | |
}; | |
const objEntries = function* (obj) { | |
for (const k in obj) if (obj.hasOwnProperty(k)) yield [k, obj[k]]; | |
}; | |
const accToString = (isObject, acc) => { | |
const [START, END] = isObject ? "{}" : "[]"; | |
let result = ""; | |
if (acc.prev) { | |
let curr = acc; | |
do { | |
if (isObject) { | |
result = | |
`,"${curr.value[0]}":${el.stringify(curr.value[1])}` + result; | |
} else { | |
result = `,${curr.value}` + result; | |
} | |
} while ((curr = curr.prev)); | |
result = result.substr(1); | |
} | |
return START + result + END; | |
}; | |
const recursive = (iter, isObject, acc, prev) => { | |
const { done, value } = iter.next(); | |
if (!done) { | |
const v = isObject ? value[1] : value; | |
switch (true) { | |
case Array.isArray(v): | |
return recursive(v[Symbol.iterator](), false, null, { | |
target: iter, | |
isObject, | |
k: isObject ? value[0] : "", | |
acc, | |
prev, | |
}); | |
case v && typeof v == "object": | |
return recursive(objEntries(v), true, null, { | |
target: iter, | |
isObject, | |
k: isObject ? value[0] : "", | |
acc, | |
prev, | |
}); | |
default: | |
return recursive(iter, isObject, { prev: acc, value }, prev); | |
} | |
} else { | |
const accStr = accToString(isObject, acc); | |
if (prev) { | |
return recursive( | |
prev.target, | |
prev.isObject, | |
{ prev: prev.acc, value: prev.isObject ? [prev.k, accStr] : accStr }, | |
prev.prev | |
); | |
} else { | |
return accStr; | |
} | |
} | |
}; | |
const stringify = (v) => { | |
const iter = Array.isArray(v) ? v[Symbol.iterator]() : objEntries(v); | |
const isObject = !Array.isArray(v); | |
return recursive(iter, isObject, null, null); | |
}; | |
stringify({ a: 3, b: 5, c: [1, 2, [3, 4, { a: 4, b: 5 }, 7], 3], d: 3 }); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
필터와 맵을 분리된 제네레이터로 작성하세요