// make-object.js
class HeaderListData {
  constructor(source, sepatator = ',') {
    const rowData = source.split('\\n');
    
    this.header = rowData[0].split(sepatator);
    this.rows = rowData
      .filter((row, index) => index > 0)
      .map(row => row.split(sepatator));
  }
  
  row = (index) => this.rows[index]
    .map((row, index) => [this.header[index], row]);

  get length() {
    return this.rows.length;
  }

  get columnLength() {
    return this.headers.length;
  }
}

export default class MakeObject extends HeaderListData {
  toObject = index => this
    .row(index)
    .reduce((a, [key, value]) => ({ ...a, [key]: value }), {});
  
  toAllObject = () =>
    Array(this.length)
      .fill(0)
      .map((item, index) => this.toObject(index));
}
// app.js
import MakeObject from './make-object.js';

const movieData = `Title,Release,Ticketing Rate, Director
보헤미안 랩소디,2018.10.31,11.5%,브라이언 싱어
완벽한 타인,2018.10.31,4.6%,이재규
동네사람들,2018.11.07,0.5%,임진순`;

const movieList = new MakeObject(movieData);
console.log(movieList.toAllObject());
// [출력 결과]
// [
//   {
//     Title: '보헤미안 랩소디',
//     Release: '2018.10.31',
//     'Ticketing Rate': '11.5%',
//     ' Director': '브라이언 싱어'
//   },
//   {
//     Title: '완벽한 타인',
//     Release: '2018.10.31',
//     'Ticketing Rate': '4.6%',
//     ' Director': '이재규'
//   },
//   {
//     Title: '동네사람들',
//     Release: '2018.11.07',
//     'Ticketing Rate': '0.5%',
//     ' Director': '임진순'
//   }
// ]