HTTP / AJAX / XML / JSON / μ§λ ¬ν & μμ§λ ¬ν / λΉλκΈ° μ½λ°± ν¨μ / μ½λ°± μ§μ₯
sort() / splice() / slice() / split() / join() / find() / filter() / map() / reduce()
[TIL] 210906 μ°Έκ³
const array = [2, 4, 1, 5, 3];
/* μ€λ¦μ°¨μ μ λ ¬ */
const ascending = array.sort((a, b) => a - b);
console.log(ascending); // [1, 2, 3, 4, 5]
/* λ΄λ¦Όμ°¨μ μ λ ¬ */
const descending = array.sort((a, b) => b - a);
console.log(descending); // [5, 4, 3, 2, 1]
π‘ splice()
μλ₯΄κ³ (μΆκ°νκΈ°) / μλ₯Έ λ°°μ΄ λ¦¬ν΄ / μλ³Έ λ°°μ΄ λ°λ
const array = [1, 2, 3, 4 ,5];
const array2 = array.splice(2, 2, 'π', 'π');
console.log(array2); // [3, 4]
console.log(array); // [1, 2, 'π', 'π', 5]
π‘ slice()
λ³΅μ¬ / 볡μ¬ν λ°°μ΄ λ¦¬ν΄ / μλ³Έ λ°°μ΄ μ λ°λ
const array = [1, 2, 3, 4, 5];
const array2 = array.slice(1, 3);
console.log(array2); // [2, 3]
console.log(array); // [1, 2, 3, 4, 5]
π‘ string.split()
β» λ°°μ΄ API μλ
λ¬Έμμ΄μ separator(ꡬλΆμ)λ₯Ό κΈ°μ€μΌλ‘ λμ΄ λ°°μ΄λ‘ λ§λ¦
limit(λμ λ¬Έμμ΄μ μ΅λ κ°μ)λ₯Ό μ§μ ν΄μ€ μ μμ
// separatorλ§ μ§μ ν κ²½μ°
const string2 = 'What are you doing now?';
const array2 = string2.split(' ');
console.log(array2); // ['What'. 'are', 'you', 'doing', 'now?']
// limitλ₯Ό 2λ‘ μ§μ ν κ²½μ°
const string = '1, 2, 3, 4, 5';
const array = string.split(', ', 2);
console.log(array); // ['1', '2']
π‘ array.join()
λ°°μ΄μ λͺ¨λ μμλ₯Ό μ°κ²°ν΄ 'νλμ' λ¬Έμμ΄λ‘ λ§λ¦
λ°°μ΄μ κ° μμλ₯Ό ꡬλΆν λ¬Έμμ΄(separator)μ μ§μ ν΄μ€ μ μμ
const array = ['radish', 'green orion', 'potato'];
const string = array.join();
console.log(string); // radish,green orion,potato
const string2 = array.join(' - ');
console.log(string2); // radish - green orion - potato
β» μλ (3) ~ (5) κ³΅ν΅ μμ
class Student { constructor(name, age, enrolled, score) { this.name = name; this.age = age; this.enrolled = enrolled; this.score = score; } } const students = [ new Student('A', 29, true, 45), new Student('B', 28, false, 80), new Student('C', 30, true, 90), new Student('D', 40, false, 66), new Student('E', 18, true, 88), ];
λ°°μ΄μ μμλ€ μ€ μ½λ°± ν¨μ return κ°μ΄ trueκ° λλ 첫 λ²μ§Έ μμμ κ° λ°ν
// μ μκ° 90μ μΈ νμ μ°ΎκΈ°
const studentWith90 = students.find((student) => student.score === 90);
console.log(studentWith90); // Student {name: 'C', age: 30, enrolled: true, score: 90}
π‘ filter()
λ°°μ΄μ μμλ€ μ€ μ½λ°± ν¨μ return κ°μ΄ trueκ° λλ μμλ€λ§μ λͺ¨μ μλ‘μ΄ λ°°μ΄μ λ°ν
// enrolled students λ°°μ΄ λ§λ€κΈ°
const enrolledStudents = students.filter((student) => student.enrolled);
console.log(enrolledStudents); // [Student, Student, Student]
π‘ map()
λ°°μ΄ λ΄μ λͺ¨λ μμ κ°κ°μ λνμ¬ μ£Όμ΄μ§ μ½λ°± ν¨μλ₯Ό νΈμΆν κ²°κ³Όλ₯Ό λͺ¨μ(λ°λ μμλ€μ λͺ¨μ) μλ‘μ΄ λ°°μ΄μ λ°ν
// νμλ€μ μ μλ§μ ν¬ν¨νλ λ°°μ΄ λ§λ€κΈ°
const scores = students.map((student) => students.score);
console.log(scores); // [45, 66, 80, 88, 90]
λΉ μμλ₯Ό μ μΈνκ³ , λ°°μ΄ λ΄μ μ‘΄μ¬νλ κ° μμμ λν΄ λ¦¬λμ ν¨μ(μ½λ°± ν¨μ)λ₯Ό ν λ²μ© μ€νν¨
κ·Έλ¬λ, μ½λ°± ν¨μμ return κ°μ λμ°κΈ°(prev)μ ν λΉλκ³ , λμ°κΈ°λ μν μ€ μ μ§λλ―λ‘ κ²°κ΅ λ¦¬λμ ν¨μλ νλμ κ°μ returnνλ€.
// νμλ€ μ μμ νκ· κ° κ΅¬νκΈ°
const scoreArray = students.map((student) => student.score);
const tatalScore = scoreArray.reduce((prev, curr) => prev + curr, 0);
const averageScore = totalScore / students.length;
cosole.log(averageScore); // 73.8
students.reduce(function (prev, curr) {
return prev + curr;
}, 0);
students.reduce(function (λμ λ μ½λ°± ν¨μ λ°νκ°, μ²λ¦¬ν νμ¬ μμ) {
return λμ λ μ½λ°± ν¨μ λ°νκ° + μ²λ¦¬ν νμ¬ μμ;
}, μ΄κΉκ°);
π‘ prev
- λμ λ μ½λ°± ν¨μ λ°νκ° (λμ°κΈ° accumulator)
- λ€λ§, λμ λ κ°μ΄ μμ§ μλ μ½λ°± ν¨μ μ΅μ΄ νΈμΆ μ
μ΄κΉκ° μ§μ O β prev = μ΄κΉκ° (curr = λ°°μ΄μ 첫 λ²μ§Έ μμ)
μ΄κΉκ° μ§μ X β prev = λ°°μ΄μ 첫 λ²μ§Έ μμ (curr = λ°°μ΄μ λ λ²μ§Έ μμ)
ν΄λΌμ΄μΈνΈκ° μλ²μ λ°μ΄ν°(hypertext)λ₯Ό μ£Όκ³ λ°μ λ μ¬μ©λλ νλ‘ν μ½(ν΅μ κ·μ½)
νμ΄νΌν
μ€νΈ(hypertext)
λ νμ΄νΌλ§ν¬ + λ¬Έμ + μ΄λ―Έμ§ νμΌ λ± μ λ°μ μΌλ‘ μ¬μ©λλ 리μμ€λ€μ ν¬ν¨νλ€.
ν΄λΌμ΄μΈνΈκ° λ°μ΄ν°λ₯Ό request νλ©΄, μλ²κ° response νλ€.
μΉ λΈλΌμ°μ κ° μλ°μ€ν¬λ¦½νΈλ₯Ό μ΄μ©νμ¬ μΉ μλ²μ λΉλκΈ°μ μΌλ‘
λ°μ΄ν°λ₯Ό μ£Όκ³ λ°κ³ , DOMμ μ΄μ©ν΄ μΉ νμ΄μ§λ₯Ό λμ μΌλ‘
κ°±μ νλ νλ‘κ·Έλλ° κΈ°λ²
λνμ μΌλ‘ XHR(XMLHttpRequest)
μ΄ μλ€. μ΅κ·Όμλ fetch() API
λ₯Ό μ¬μ©νλ€.
π‘ XMLμ΄λ?
Tagλ₯Ό μ΄μ©ν΄ λ°μ΄ν°λ₯Ό λνλ΄λ λ§ν¬μ μΈμ΄ μ€ νλ
λΆνμν νκ·Έλ€μ΄ λ§μ΄ λ€μ΄κ° νμΌ μ¬μ΄μ¦κ° 컀μ§λ©°, κ°λ μ±λ μ’μ§ μλ€
π‘ AJAXμ XHRμ λͺ¨λ XMLμ΄ λ€μ΄κ°λ€. κ·Έλ λ€λ©΄
μλ²μ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°μ λλ
XMLλ§ κ°λ₯ν κ²μΈκ°?μλμ€.
λ€μν νμΌ ν¬λ§·μ μ£Όκ³ λ°μ μ μλ€.
κ·Έ μ€ νλκ° JSONμ΄λ€.λ€λ§, AJAXκ³Ό XHRμ λͺ¨λ XMLμ΄ λ€μ΄κ°λ κ²μ μ΄λ€μ΄ κ°λ°λλ λΉμ κ°λ°νμ΄ XMLμ μ¬μ©νκ³ μμκΈ° λλ¬Έμ΄λ€.
ν€-κ° μ
μΌλ‘ μ΄λ£¨μ΄μ§, κ²½λμ λ°μ΄ν° κ΅ν κ·μΉ(λ°μ΄ν° ν¬λ§·)
'λΈλΌμ°μ λ λͺ¨λ°μΌμμ μλ²μ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°μ λ' νΉμ μλ²μ ν΅μ νμ§ μμλ 'μ€λΈμ νΈλ₯Ό νμΌ μμ€ν μ μ μ₯ν λ' μ¬μ©ν μ μλ€
μ¬λ λμΌλ‘ μ½κΈ° νΈνλ©°, ν μ€νΈ(string)λ₯Ό κΈ°λ°μΌλ‘ ν΄ κ°λ³λ€
μλ²μ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°μ λ λ°μ΄ν°λ₯Ό μ§λ ¬ννκ³ μ μ‘
νλ λ° μ¬μ©λλ€
νλ‘κ·Έλλ° μΈμ΄λ νλ«νΌμ μκ΄μμ΄ μ¬μ©ν μ μλ€.
π‘ λΈλΌμ°μ μ μλ²κ° JSONμ μ΄μ©ν΄ ν΅μ νλ κ³Όμ
μ€λΈμ νΈλ₯Ό μλ²μ μ μ‘νκΈ° μν΄μλ
μ§λ ¬ν(serialize)
λ₯Ό ν΄μΌ νλ€. μ§λ ¬νλ μ€λΈμ νΈλ₯Ό, { key: value } ννμ ν μ€νΈ μ¦ JSONμΌλ‘ λ³ννλ κ²μ λ§νλ€.JSONμΌλ‘ μ§λ ¬νλ μ€λΈμ νΈλ₯Ό λΈλΌμ°μ μ νκΈ°νκΈ° μν΄μλ
μμ§λ ¬ν(deserialize)
λ₯Ό ν΄μΌ νλ€. μμ§λ ¬νλ { key: value } ννμ ν μ€νΈ μ¦ JSONμ, μ€λΈμ νΈλ‘ λ€μ λ³ννλ κ²μ λ§νλ€.
JSON.stringify()
λ₯Ό μ¬μ©νμ¬ μλ°μ€ν¬λ¦½νΈ κ°μ΄λ μ€λΈμ νΈλ₯Ό JSON λ¬Έμμ΄λ‘ λ³νν μ μλ€.
π boolean β json
let json = JSON.stringify(true);
console.log(json); // true
console.log(typeof json); // string
π λ°°μ΄ β json
""
λ₯Ό μ¬μ©νλ€.json = JSON.stringify(['apple', 'banana']);
console.log(json);
// ["apple", "banana"] β λ°°μ΄μ²λΌ 보μ΄μ§λ§, λ¬Έμμ΄μ΄λ€.
console.log(typeof json); // string
π μ€λΈμ νΈ β json
ν¨μ
(μ€λΈμ νΈμ μλ λ°μ΄ν° x)μ Symbol
(μλ°μ€ν¬λ¦½νΈμλ§ μλ νΉλ³ν λ°μ΄ν°)μ΄ jsonμΌλ‘ λ³νλ λλ, κ°μ²΄ μμ μμ κ²½μ° μλ΅λκ³ , λ°°μ΄ μμ μμ κ²½μ° nullλ‘ λ³νλλ€.const rabbit = {
name: 'happy',
color: 'white',
size: null,
birthDate: new Date(),
symbol: Symbol("id"), // json λ³ν μ μλ΅
jump : () => { // json λ³ν μ μλ΅
console.log('you can jump!');
},
};
json = JSON.stringify(rabbit);
console.log(json);
// {"name":"happy","color":"white","size":null,"birthDate":"2021-10-11T06:28:27.059Z"}
console.log(typeof json); // string
π‘ replacer
MDN μ¬μ΄νΈ μ°Έκ³
JSON.stringify()μ 맀κ°λ³μλ‘ replacerλ₯Ό μΆκ°ν¨μΌλ‘μ¨ JSON λ¬Έμμ΄μ μ’ λ μΈλ°νκ² ν΅μ ν μλ μλ€.
replacerλ ν¨μ λλ λ°°μ΄
μ΄ λ μ μλ€.
replacerλ, JSON λ¬Έμμ΄μ μΆκ°λμ΄μΌ νλ κ°μ, λ°νν΄μΌ νλ€. return value;
replacerκ° undefinedλ₯Ό λ°ν
νλ©΄, κ·Έ μμ±μ JSON λ¬Έμμ΄ κ²°κ³Όμ ν¬ν¨λμ§ μλλ€.
replacer κ°μ΄ null μ΄κ±°λ μ 곡λμ§ μμΌλ©΄, κ°μ²΄μ λͺ¨λ μμ±λ€
μ΄ JSON λ¬Έμμ΄ κ²°κ³Όμ ν¬ν¨λλ€. (Symbol, ν¨μ λ± μ μΈ)
π replacerκ°
λ°°μ΄
μΈ κ²½μ°
- λ°°μ΄μ μμλ 'μμ±'μ΄μ΄μΌ νλ€.
- ν΄λΉ μμ±κ³Ό κ·Έ κ°λ§μ΄ JSONμ ν¬ν¨λλ€.
json = JSON.stringify(rabbit, ['name', 'size', 'color']); console.log(json); // {"name":"tori","size":null,"color":"white"}
π replacerκ°
μ½λ°± ν¨μ
μΈ κ²½μ°
- 맀κ°λ³μλ‘λ 'λ¬Έμμ΄ν λ keyμ value'λ₯Ό λ°λλ€.
- 맨 μ²μμλ λ¬Έμμ΄ν λ κ°μ²΄ μ체κ°, μ΄λ₯Ό λνλ΄λ λΉμ΄ μλ κ·Έ keyμ ν¨κ» νΈμΆλλ€. π
κ·Έ λ€μμλ λ¬Έμμ΄ν λ κ·Έ κ°μ²΄μ κ° μμ±μ λνμ¬ νΈμΆλλ€.// replacerμ 맀κ°λ³μ(key, value)κ° λ¬΄μμ μλ―Ένλμ§ μμ보μ json = JSON.stringify(rabbit, (key, value) => { console.log(`${key}, ${value}`); return value; }); // console μ°½ κ²°κ³Ό /* , [object Object] π λ¬Έμμ΄ν λ κ°μ²΄ μ체κ°, λΉμ΄ μλ κ·Έ keyμ ν¨κ» νΈμΆλ¨ name, happy color, white size, null birthDate, 2021-10-11T07:42:51.692Z jump, () => { console.log(`${name} can jump!`); } */
- keyμ valueκ° replacer(μ½λ°± ν¨μ)λ₯Ό ν λ²μ© κ±°μ³€λ€κ° JSONμΌλ‘ λ°λλ€
/* μμ 1 */ json = JSON.stringify(rabbit, (key, value) => { return key === 'name' ? 'syong' : value; }); console.log(json); // {name: 'syong', color: 'white', size: null, birthDate: Mon Oct 11 2021 16:32:18 GMT+0900 (νκ΅ νμ€μ), jump: Ζ} /* μμ 2 */ json = JSON.stringify(rabbit, (key, value) => { if (typeof value === 'string') { return undefined; } return value; }); console.log(json); // {"size":null}
JSON.parse()
λ₯Ό μ¬μ©νμ¬ JSON λ¬Έμμ΄μ ꡬ문μ λΆμνκ³ , μλ°μ€ν¬λ¦½νΈ κ°μ΄λ μ€λΈμ νΈλ₯Ό μμ±ν μ μλ€.
json = JSON.stringify(rabbit);
const obj = JSON.parse(json);
console.log(obj);
// {name: 'happy', color: 'white', size: null, birthDate: '2021-10-11T11:31:25.142Z'}
π‘ μ£Όμ!
μ§λ ¬νλ₯Ό ν΅ν΄ λ§λ€μ΄μ§ JSON λ¬Έμμ΄
μλ jump ν¨μκ° ν¬ν¨λμ§ μμμΌλ―λ‘ μμ§λ ¬νλ₯Ό ν΅ν΄ λ§λ€μ΄μ§ μ€λΈμ νΈ
μλ jump ν¨μλ ν¬ν¨λμ΄ μμ§ μλ€. λ°λΌμ, jump() λ©μλλ₯Ό μ€ννλ©΄ μ€λ₯κ° λ¬λ€.
λ§μ°¬κ°μ§λ‘, μ§λ ¬νλ₯Ό ν΅ν΄ λ§λ€μ΄μ§ JSON λ¬Έμμ΄
μμ birthDate μμ±μ κ°μ΄ Date κ°μ²΄κ° μλλΌ λ¬Έμμ΄μ΄μμΌλ―λ‘ μμ§λ ¬νλ₯Ό ν΅ν΄ λ§λ€μ΄μ§ μ€λΈμ νΈ
μμλ birthDate μμ±μ κ°μ λ¬Έμμ΄μ΄λ€. λ°λΌμ, getDate() λ©μλλ₯Ό μ€ννλ©΄ μ€λ₯κ° λ¬λ€.
console.log(rabbit.jump()); // you can jump!
console.log(obj.jump()); // not a function μ€λ₯
console.log(rabbit.birthDate.getDate()); // 11
console.log(obj.birthDate.getDate()); // not a function μ€λ₯
π‘ reviver
const obj = JSON.parse(json, (key, value) => {
return key === 'birhDate' ? new Date(value) : value;
});
console.log(obj.birthDate.getDate); // 11
cf. μμλλ©΄ μ μ©ν μ¬μ΄νΈ
β JSON Diff : μλ²μ μμ²ν΄μ λ°μμ¨ 2κ°μ λ°μ΄ν°κ° λ€λ₯Έ κ³³μ΄ μ΄λμ§λ₯Ό μλ €μ€
β‘ JSON Beautifier : μλ²μμ λ°μμ¨ JSONμ 볡λΆν λ ν¬λ§·μ΄ λ§κ°μ§ κ²½μ° μμ볡κ·μμΌμ€
β’ JSON Parser : JSONμ μ€λΈμ νΈ ννλ‘ λ°κΏμ€
β£ JSON Validator : JSONμμ μ€λ₯κ° λ°μν κ³³μ μλ €μ€
μλ°μ€ν¬λ¦½νΈλ λκΈ°μ μ΄λ€.
λκΈ°μ (synchronous)
: μμ²κ³Ό κ²°κ³Όκ° λμμ μΌμ΄λ¨
μ¦, μλ°μ€ν¬λ¦½νΈ μ½λλ, νΈμ΄μ€ν
μ΄ λ νμλ, μμ±λ μμμ λ°λΌ λκΈ°μ μΌλ‘ μ€νλλ€.
cf. νΈμ΄μ€ν
(hoisting)
λ³μ varμ ν¨μ μ μΈμμ΄ μλμΌλ‘ μ μΌ μλ‘ μ¬λΌκ°λ κ²
console.log(1);
console.log(2);
console.log(3);
// 1
// 2
// 3
ννΈ,
λΉλκΈ°μ (asynchronous)
: μμ²κ³Ό κ²°κ³Όκ° λμμ μΌμ΄λμ§ μμ
μ¦, μ½λκ° μΈμ μ€νλ μ§ μμΈ‘ν μ μμμ μλ―Ένλ€.
console.log(1);
setTimeout(() => console.log(2), 1000);
console.log(3);
// 1
// 3
// 2
π‘ synchronous callback
function printImmediately (print) {
print();
}
printImmediately(() => console.log('sync callback'));
π‘ asynchronous callback
λΉλκΈ° μ½λ°± ν¨μλ₯Ό ν¬ν¨ν΄, μμ μμλ€μ μ λΆ ν©μ³μ μλμ κ°μ΄ μμ±λμ΄ μλ€κ³ νμ.
'use strict';
console.log(1);
setTimeout(() => console.log(2), 1000);
console.log(3);
function printImmediately (print) {
print();
}
printImmediately(() => console.log('sync callback'));
function printWithDelay (print, timeout) { // setTimeoutμ wrappingνκ³ μλ ν¨μ
setTimeout(print, timeout);
}
printWithDelay(() => console.log('async callback'), 2000);
μ΄ μ½λλ₯Ό μλ°μ€ν¬λ¦½νΈ μμ§μ μλμ κ°μ΄ μ΄ν΄νλ€.
'use strict';
// ν¨μ μ μΈμ νΈμ΄μ€ν
(hoisting)
function printImmediately (print) {
print();
}
function printWithDelay (print, timeout) {
setTimeout(print, timeout);
}
console.log(1); // λκΈ°μ μ€ν
setTimeout(() => console.log(2), 1000); // λΉλκΈ°μ μ€ν
console.log(3); // λκΈ°μ μ€ν
printImmediately(() => console.log('sync callback')); // λκΈ°μ μ€ν
printWithDelay(() => console.log('async callback'), 2000); // λΉλκΈ°μ μ€ν
// 1
// 3
// sync callback
// 2
// async callback
μ½λ°± ν¨μ μ€μ²© μ¬μ©
μ μλ―Ένλ€
μμ
μ¬μ©μμκ² idμ password μ λ ₯ κ°μ λ°μμλΌ
idμ passwordλ₯Ό μ΄μ©ν΄ μλ²μ λ‘κ·ΈμΈ λλλ‘ μμ²ν΄λΌ
(μλ²μμ ν΅μ μ setTimeout ν¨μλ‘ λ체ν΄λΌ)
λ‘κ·ΈμΈμ μ±κ³΅μ μΌλ‘ νλ€λ©΄
λ‘κ·ΈμΈν μ¬μ©μμ idλ₯Ό μ΄μ©ν΄ μ¬μ©μμ rolesλ₯Ό μμ²ν΄ λ°μμλΌ
rolesκ° μ±κ³΅μ μΌλ‘ λ°μμ‘λ€λ©΄
ν΄λΌμ΄μΈνΈλ μ¬μ©μμ μ΄λ¦κ³Ό μν μ΄ λ€μ΄ μλ μ€λΈμ νΈλ₯Ό κ°μ§κ³ μμ κ², μ΄λ₯Ό μΆλ ₯ν΄λΌ
class UserStorage {
loginUser (id, password, onSuccess, onError) {
setTimeout(() => {
if (id === 'syong' && password === 'happy' ||
id === 'corder' && password === 'nice') {
onSuccess(id);
} else {
onError(new Error('not found'));
}
}, 2000);
}
getRoles (user, onSuccess, onError) {
setTimeout(() => {
if (user === 'syong') {
onSuccess({ name: 'syong', role: 'admin' });
} else {
onError(new Error('no access'));
}
}, 1000);
}
}
const userStorage = new UserStorage();
const id = prompt('idλ₯Ό μ
λ ₯ν΄μ£ΌμΈμ');
const password = prompt('passwordλ₯Ό μ
λ ₯ν΄μ£ΌμΈμ');
userStorage.loginUser(id, password, user => {
userStorage.getRoles(user, userWithRoles => {
alert(`${userWithRoles.role} ${userWithRoles.name}λ, νμν©λλ€!`);
}, error => {
throw error;
});
}, error => {
throw error;
});
μ΄λ κ² μμ±νλ©΄ κ°λ μ±μ΄ λ§€μ° μ’μ§ μμ λλ²κΉ κ³Ό μ μ§Β·λ³΄μλ₯Ό νκΈ°κ° λ§€μ° μ΄λ ΅λ€.