Tekky
Tekky

Reputation: 89

Split each element in array into object after certain character

I'm new to node.js and javascript. I have the following array:

var oldarray = [
  'name1\tstreet\tperson\tphone1\tphone2\nname2\street2\tperson1\tphone82\tphone3\n'
]

Note, this is a single element array. First, I require the array to contain a new element after each new line first, then, re-format like below:

let headers = {
  name: "",
  street: "",
  person: "",
  phone 1 "",
  phone 2 ""
}

How can I parse through each element (after creating a new element after each +), and assign an object within an array after each instance of \

The desired output is this:

[{
  name: 'name1',
  street: 'street2',
  person: 'person1',
  phone1: 'phone82 ',
  phone2: 'phone3'
},
{
  name: 'name2',
  street: 'street2',
  person: 'person1',
  phone1: 'phone1 ',
  phone2: 'phone2'
}]

Any help is highly appreciated.

Upvotes: 0

Views: 1390

Answers (3)

Sven.hig
Sven.hig

Reputation: 4519

First split the array by \n to get individual paths and then split them by \t, and use reduce to create new header objects from each subarray

var oldarray = [
  'name1\tstreet\tperson\tphone1\tphone2\n' +
    'name2\tstreet2\tperson1\tphone82\tphone3\n' +
    'name4\tstreet4\tperson4\tphone84\tphone4\n'
]
arr = oldarray.flatMap(o => o.split("\n"))
c = arr.map(o => o.split("\t"))
c.pop()
result = c.reduce((acc,[name, street, person, phone1, phone2],i) => {
   acc = [...acc,{name:name,street:street,person:person,phone1:phone1,phone2:phone2}]
           return acc
},[])
console.log(result)

Upvotes: 0

Omri Attiya
Omri Attiya

Reputation: 4037

If you have the same structure for all items in OLD_ARRAY you can use map, filter and reduce in order to manipulate your input.

So what I did?

  1. In case that you have multiple strings like the example input (more than 1 array item) I convert it to sub-arrays of each string by using map and split by \n, which is your string separator. Than I filtered it by strings that are not empty (becasue that you have a post-fix of \n as well).
  2. From each sub-array I extracted all the contacts using extractContacts function - it splites the sub-array by your separaotr, \t, and map it according to your contacts temaplte.
  3. Since it's a format of array of arrays, I used reduce to concat all the arrays together

const OLD_ARRAY = [
  'name1\tstreet\tperson\tphone1\tphone2\n' +
  'name2\tstreet2\tperson1\tphone82\tphone3\n'
];

function extractContacts(templates) {
  return templates.map(t => t.split('\t'))
    .map(details => ({
      name: details[0],
      street: details[1],
      person: details[2],
      phone1: details[3],
      phone2: details[4]
    }));
}

let contacts = OLD_ARRAY.map(str => str.split('\n').filter(str => str !== ''))
  .map(template => extractContacts(template))
  .reduce((a, acc) => acc.concat(a), []);

console.log(contacts)

Upvotes: 2

Nick
Nick

Reputation: 147206

You can split each oldarray value on \n and then \t into newarray, and then use Object.fromEntries to build an object from each newarray value, combining the split values with each key from headers:

var oldarray = [
  'name1\tstreet\tperson\tphone1\tphone2\n' +
  'name2\tstreet2\tperson1\tphone82\tphone3\n'
]

let newarray = [];

oldarray.forEach(s => s.trim().split('\n').map(v => newarray.push(v.split('\t'))));

let headers = {
  'name': "",
  'street': "",
  'person': "",
  'phone 1': "",
  'phone 2': ""
}

let keys = Object.keys(headers);

out = newarray.map(s => Object.fromEntries(s.map((v, i) => [keys[i], v])));
console.log(out);

Upvotes: 1

Related Questions