1. νμ νλ¦ μ μ§νκΈ°
νμ μ λ³΄κ° κ·Έλλ‘ μ μ§λλ©΄μ νμ νλ¦μ΄ κ³μ μ λ¬λλ κ²μ κ°λ°μλ‘ νμ¬κΈ νμ 체ν¬μ λν μ κ²½μ μ€μΌ μ μκ² λμμ€λ€. μ§μ 루νλ₯Ό ꡬννλ κ²λ³΄λ€ λ΄μ₯λ ν¨μν κΈ°λ²κ³Ό λ‘λμ κ°μ μ νΈλ¦¬ν° λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ κ²μ΄ νμ μ 보λ₯Ό κ·Έλλ‘ μ μ§νλλ° μ ν©νλ€. νμ μ λ³΄κ° κ·Έλλ‘ μ μ§λλ κ²μ λ€μκ³Ό κ°μ μ₯μ μ κ°μ§κ³ μλ€.
- νμ νλ¦μ κ°μ νλ€.
- κ°λ μ±μ λμΈλ€.
- λͺ μμ μΈ νμ ꡬ문μ νμμ±μ μ€μΈλ€.
λͺ κ°μ§ μμλ₯Ό ν΅ν΄ μ μ°¨ν νλ‘κ·Έλλ°, ν¨μν νλ‘κ·Έλλ° κ·Έλ¦¬κ³ λ‘λμλ₯Ό ν΅ν΄ ꡬννμ¬ μ΄λ€ νΉμ§μ΄ μλμ§ μ΄ν΄λ³΄μ.
2. CSV λ°μ΄ν° νμ±νκΈ°
λ€μκ³Ό κ°μ CSV λ°μ΄ν°κ° μλ€. μ΄λ₯Ό νμ±ν΄λ³΄μ.
const csvData = `μ°λ,μ μ‘°μ¬,λͺ¨λΈ,μ€λͺ
,κ°κ²©
1997,Ford,E350,ac abs moon,3000.00
1999,Chevy,Venture Extended Edition,,4900.00
1999,Chevy,Venture Extended Edition,Very Large,5000.00
1996,Jeep,Grand Cherokee,MUST SELL! air moon roof loaded,4799.00`;
const rawRows = csvData.split('\n'); // μ΄μ κΈ°μ€μΌλ‘ λλκΈ°
const headers = rawRows[0].split(','); // ν€λλΆλΆμ , κΈ°μ€μΌλ‘ λλκΈ°
2-1. μ μ°¨ν νλ‘κ·Έλλ°
const rows = rawRows.slice(1).map((rowStr) => {
const row: Record<string, string> = {}; // row κ°μ²΄μ λν νμ
μ μΈμ΄ νμνλ€.
rowStr.split(',').forEach((value, j) => {
row[headers[j]] = value;
});
return row;
});
μ μ½λμμ rowκ°μ²΄λ νμ μ μΈμ΄ νμνλ€. λλ¬Έμ Recod<string, string> μ κ°μ μΈλ±μ€ μκ·Έλμ² νμ μ μ μΈνμλ€.(μμΌλ©΄ νμ μλ¬κ° λμ.)
2-2. ν¨μν νλ‘κ·Έλλ°
const rows = rawRows
.slice(1)
.map((rowStr) =>
rowStr
.split(',')
.reduce(
(row: Record<string, string>, value, i) => ( // row κ°μ²΄μ λν νμ
μ μΈμ΄ νμνλ€.
(row[headers[i]] = value), row
),
{}
)
);
μ μ½λμμλ rowκ°μ²΄μ λν νμ μ μΈμ΄ νμνλ€. μ μ°¨ν νλ‘κ·Έλλ°κ³Ό λ€λ₯Έ μ μ λ©μλμ μ¬μ©μ΄λ€. μ μ°¨ν νλ‘κ·Έλλ°μμλ forEach λ©μλλ₯Ό μ¬μ©νμ¬ κ°κ°μ μνλ₯Ό ν΅ν΄ rowκ°μ²΄λ₯Ό λ§λ€μ΄ λ°νμ νλ€. ν¨μν νλ‘κ·Έλλ°μμλ reduce λ©μλλ₯Ό μ¬μ©νμ¬ row κ°μ²΄λ₯Ό λ§λ€μ΄ λ°νμ νλ€. μ¦, μ§μ 루νλ₯Ό ꡬνμ νλλ μ νλλμ μ°¨μ΄μ΄λ€.
2-3. λ‘λμμ zipObject ν¨μλ₯Ό μ΄μ©
const rows = rawRows
.slice(1)
.map((rowStr) => _.zipObject(headers, rowStr.split(',')));
μ½λκ° λ§€μ° μ§§μμ§ κ²μ νμΈν μ μλ€. λν λ³λμ νμ μ μΈμ νμ§ μλ κ²μ λ³Ό μ μλ€. μ΄λ zipObject λ©μλκ° λ°ννλ νμ (Dictionary)μ΄ μ΄λ―Έ μ ν΄μ Έ μκΈ° λλ¬Έμ΄λ€.
λ€μμ λ‘λμμμ μ 곡νλ Dictionary νμ μ΄λ€.
interface Dictionary<T> {
[index: string]: T;
}
μ΄λ¬ν Dictionary νμ μ zipObject λ©μλκ° λ°ννκΈ° λλ¬Έμ λ³λμ νμ κ΅¬λ¬Έμ΄ μμ΄λ rowsμ νμ (_.Dictionary<string>[])μ μ νν μ¬μ©ν μ μλ€.
3. ν¬λ£¨ λͺ λ¨μ λ¨μ λͺ©λ‘μΌλ‘ λ§λ€κΈ°
λ€μκ³Ό κ°μ ν¬λ£¨ λͺ λ¨μ΄ μλ€.
interface woowacrew {
name: string;
team: string;
salary: number;
}
const λ°μΌλ¦¬μ‘°: { [team: string]: woowacrew[] } = {
곡μ: [{ name: 'λ
Έμ', team: '곡μ', salary: 10 }],
μ€: [
{ name: 'νλ―Έ', team: 'μ€', salary: 11 },
{ name: 'μ λ‘', team: 'μ€', salary: 9 },
{ name: 'μ½λ', team: 'μ€', salary: 12 },
],
μΌμ: [{ name: 'μΏ λ§', team: 'μΌμ', salary: 8 }],
ν¬λ‘ : [{ name: '루루', team: 'ν¬λ‘ ', salary: 7 }],
};
λ 벨 2 λ°μΌλ¦¬μ‘°μ λͺ λ¨μ΄λ€. ν¬λ£¨λ€μ name, team, salary μμ±μ κ°μ§κ³ μλ€. λν μ½μΉμ λ°λΌ λ°μΌλ¦¬μ‘°κ° λ€λ₯΄λ€. μ¦, λ°μΌλ¦¬μ‘° κ°μ²΄λ ν€κ° μ½μΉμ΄λ¦μ΄κ³ κ°μ΄ ν¬λ£¨λ€μ ν¬ν¨ν λ°°μ΄μ΄λ€.
μ΄μ κ°μ λ°μΌλ¦¬μ‘° κ°μ²΄λ₯Ό λ¨μ λͺ©λ‘μΌλ‘ λ§λ€μ΄λ³΄μ.
3-1. 루νλ₯Ό μ¬μ©ν λ°©λ²
let λͺ¨λ ν¬λ£¨λ€: woowacrew[] = []; // νμ
ꡬ문 νμ
for (const λ°μΌλ¦¬ν¬λ£¨λ€ of Object.values(λ°μΌλ¦¬μ‘°)) {
λͺ¨λ ν¬λ£¨λ€ = λͺ¨λ ν¬λ£¨λ€.concat(λ°μΌλ¦¬ν¬λ£¨λ€);
}
for... of λ¬Έμ μ¬μ©ν λ°©λ²μ΄λ€. λ°λ³΅μ ν΅ν΄ λͺ¨λ ν¬λ£¨λ€ λ°°μ΄μ κ° λ°μΌλ¦¬μ‘°μ μν ν¬λ£¨λ€μ push νκ³ μλ€. μ΄λ concat λ©μλλ₯Ό μ¬μ©νλ€.
λͺ¨λ ν¬λ£¨λ€ λ°°μ΄μ woowacrew[ ] μ κ°μ΄ νμ μ μΈμ ν κ²μ λ³Ό μ μλ€. μ΄μ κ°μ΄ 루νλ₯Ό μ¬μ©νκ² λλ€λ©΄ νμ μ μΈμ ν΄μΌ νμ 체ν¬κ° λλ€.
3-2. Array.prototype.flat λ©μλλ₯Ό μ¬μ©ν λ°©λ²
const λͺ¨λ ν¬λ£¨λ€ = Object.values(λ°μΌλ¦¬μ‘°).flat();
flat λ©μλλ λ€μ°¨μ λ°°μ΄μ νννν΄ μ€λ€. νμ μκ·Έλμ²λ T[][] => T[] κ°λ€. μ΄λ λ― μλ°μ€ν¬λ¦½νΈμ λ΄μ₯ ν¨μλ₯Ό μ¬μ©νκ² λλ©΄ λͺ¨λ ν¬λ£¨λ€ λ°°μ΄μ λ³λ€λ₯Έ νμ μ μΈ μμ΄ λ€μκ³Ό κ°μ νμ μ΄ μΆλ‘ λλ€.
const λͺ¨λ ν¬λ£¨λ€: woowacrew[]
4. κ²°λ‘
- λ΄μ₯λ ν¨μν κΈ°λ²λ€, λ‘λμμ κ°μ λΌμ΄λΈλ¬λ¦¬λ ν¨μ νΈμΆ μ μ λ¬λ 맀κ°λ³μ κ°μ 건λλ¦¬μ§ μκ³ λ§€λ² μλ‘μ΄ κ°μ λ°ννλ€.
- λ‘λμμ κ°μ λΌμ΄λΈλ¬λ¦¬ νΉμ λ΄μ₯λ ν¨μν κΈ°λ²μ μ¬μ©νμ¬ νμ μ λ³΄κ° μ μ μ§λλ μ μ νμ©νμ.
- λ΄μ₯λ ν¨μν κΈ°λ²μ μ νμ©νμ.
- λ‘λμμ κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ€κ°μ μΆκ°ν λ μ μ€νμ.