-1

There is a string imitating a CSV file, you have to pass it into a function and get an array consisting of the objects. How to do it? Please help.

function STRtoArray (str) {
    // Code here
}

var str = 'Name,Age,Car,wife \n John,25,,true\n Ben,31,wolksvagen,false'

The result is expected as follows:

[
  {
    Name: John,
    Age: 25,
    Car: false,
    wife: true
  },
  {
    Name: Kolya,
    Age: 31,
    Car: wolksvagen,
    wife: false
  }
]
Sebastian Simon
  • 18,263
  • 7
  • 55
  • 75

2 Answers2

0

function strToArray (str) {
  var lines = str.split(/\n/);
  var keys = lines[0].split(',');
  var arr = [];
  for (var i = 1; i < lines.length; i++) {
    var line = lines[i].trim().split(',');
    var obj = {};
    for (var j = 0; j < line.length; j++) {
      obj[keys[j].trim()] = (line[j].length 
                             ? (line[j] === 'true' 
                                ? true 
                                : (line[j] === 'false'
                                  ? false
                                  : (isNaN(line[j])
                                    ? line[j]
                                    : parseInt(line[j]))))
                             : false);
    }
    arr.push(obj);
  }
  return arr;
}
var str = 'Name,Age,Car,wife \n John,25,,true\n Ben,31,wolksvagen,false'
console.log(strToArray(str));
tklg
  • 2,572
  • 2
  • 19
  • 24
0

The solution using String.prototype.split(), Array.prototype.map() and Array.prototype.reduce()functions:

function STRtoArray(str) {
  var lines = str.split('\n'),
      keys = lines[0].trim().split(',');   // getting key fields         

  var result = lines.slice(1).map(function (l){            
    return l.trim().split(',').reduce(function (r, l, i) {
      if (i === 1) l = Number(l);  // casting 'Age' field to number type
      if (i === 3) l = Boolean(l === 'true'? 1:0);
      r[keys[i]] = l;
      return r;
    }, {});
  });

  return result;
}

var str = 'Name,Age,Car,wife \n John,25,,true\n Ben,31,wolksvagen,false'
console.log(STRtoArray(str));
RomanPerekhrest
  • 88,541
  • 4
  • 65
  • 105