Ichrak Mansour
Ichrak Mansour

Reputation: 1942

How I can split my array to multiple arrays based in a value with Javascript?

I have an array and I want to split it to multiple arrays based on the value 'Finished', when I find it, I split the array.

My code is :

var input = ['urlGettingF', '├─BROKEN─aquaHTTP_404', '├─BROKEN─url1HTTP_404' , 'ok', 'urlok', 'Finished', 
            'urlGettingF2', '├─BROKEN─url1HTTP_404','├─BROKEN─url21HTTP_404', 'Finished',
            'urlGettingF3', '├─BROKEN─url3HTTP_404','├─BROKEN─url213HTTP_404', 'Finished'
];

function chunkArray(array, size) {
  let result = []
  for (value of array) {
    let lastArray = result[result.length - 1]
    if (!lastArray || lastArray.length == size) {
      result.push([value])
    } else {
      lastArray.push(value)
    }
  }
  return result
}

const x = input.findIndex(element => element.indexOf('Finished') > -1)
console.log(chunkArray(input, x + 1));

when I run it I get :

enter image description here

But I want the result will be :

[["urlGettingF", "├─BROKEN─aquaHTTP_404", "├─BROKEN─url1HTTP_404", "ok", "urlok", "Finished"], ["urlGettingF2", "├─BROKEN─url1HTTP_404", "├─BROKEN─url21HTTP_404", "Finished"], ["urlGettingF3", "├─BROKEN─url3HTTP_404", "├─BROKEN─url213HTTP_404", "Finished"]]

When I find Finished, I split my array based on her index, you can see my code in jsbin https://jsbin.com/benozuyutu/1/edit?js,console

How I can fix it ?

Upvotes: 1

Views: 1836

Answers (5)

StepUp
StepUp

Reputation: 38209

You can use reduce method. In reduce method, it is necessary to check whether keyword to find exists and if exists push into newly created array. Otherwise, we are pushing into existing array:

let keywordToFind = 'urlGettingF';

const result = input.reduce((a, c) => {
    (c.includes(keywordToFind)) ? a.push([c]) : a[a.length - 1].push(c); 
    return a;
}, []);

An example:

var input = ['urlGettingF', '├─BROKEN─aquaHTTP_404', 
   '├─BROKEN─url1HTTP_404', 'ok', 'urlok', 'Finished',
  'urlGettingF2', '├─BROKEN─url1HTTP_404', '├─BROKEN─url21HTTP_404', 'Finished',
  'urlGettingF3', '├─BROKEN─url3HTTP_404', '├─BROKEN─url213HTTP_404', 'Finished'
];


let keywordToFind = 'urlGettingF';
const result = input.reduce((a, c) => {
    (c.includes(keywordToFind)) ? a.push([c]) : a[a.length - 1].push(c);
    return a;
}, []);

console.log(result);

Upvotes: 1

ettakhi
ettakhi

Reputation: 187

var input = ['urlGettingF', '├─BROKEN─aquaHTTP_404', '├─BROKEN─url1HTTP_404', 'ok', 'urlok', 'Finished', 'urlGettingF2', '├─BROKEN─url1HTTP_404', '├─BROKEN─url21HTTP_404', 'Finished', 'urlGettingF3', '├─BROKEN─url3HTTP_404', '├─BROKEN─url213HTTP_404', 'Finished']

const res = input
  .join(' ')
  .split('Finished')
  .map(item => item.split(' ').filter(item => item))
  .filter(item => item.length)
  .map(item => [...item, 'Finished'])
 
console.log(res)

Upvotes: 2

Aditya Bhave
Aditya Bhave

Reputation: 1028

You can use following algorithm.

  1. Find indexOf('Finished')
  2. Use Array.splice function to get the values till the index. .splice also updates the existing Array.
  3. Do above until indexOf('Finished') > -1
  4. Finally, add the remaining input array in the output array

let input = ['urlGettingF', '├─BROKEN─aquaHTTP_404', '├─BROKEN─url1HTTP_404', 'ok', 'urlok', 'Finished',
  'urlGettingF2', '├─BROKEN─url1HTTP_404', '├─BROKEN─url21HTTP_404', 'Finished',
  'urlGettingF3', '├─BROKEN─url3HTTP_404', '├─BROKEN─url213HTTP_404', 'Finished'
];

let output = [];

while (true) {
  output.push(input.splice(0, input.indexOf('Finished') + 1));

  if (input.indexOf('Finished') === -1) {
    input.length && output.push(input); //to add all remaining values
    
    break;
  }
}

console.log(output);

Upvotes: 1

Umair Khan
Umair Khan

Reputation: 1752

var input = ['urlGettingF', '├─BROKEN─aquaHTTP_404', '├─BROKEN─url1HTTP_404', 'ok', 'urlok', 'Finished',
  'urlGettingF2', '├─BROKEN─url1HTTP_404', '├─BROKEN─url21HTTP_404', 'Finished',
  'urlGettingF3', '├─BROKEN─url3HTTP_404', '├─BROKEN─url213HTTP_404', 'Finished'
];

function chunkArray(arr) {
  let result = [
    []
  ];
  let index = 0;
  arr.forEach((x, i) => {
    result[index].push(x);
    if ((i + 1) < arr.length && x.includes('Finished')) {
      index++;
      result[index] = [];
    }
  });
  return result
}
console.log(chunkArray(input));

Upvotes: 1

CertainPerformance
CertainPerformance

Reputation: 371233

You might find all occurrences of Finished with .reduce, then create a new array by .sliceing each occurrence at the found indicies:

var input = ['urlGettingF', '├─BROKEN─aquaHTTP_404', '├─BROKEN─url1HTTP_404', 'ok', 'urlok', 'Finished',
  'urlGettingF2', '├─BROKEN─url1HTTP_404', '├─BROKEN─url21HTTP_404', 'Finished',
  'urlGettingF3', '├─BROKEN─url3HTTP_404', '├─BROKEN─url213HTTP_404', 'Finished'
];

const finishedIndicies = input.reduce((a, item, i) => {
  if (item === 'Finished') {
    a.push(i);
  }
  return a;
}, []);
const chunked = finishedIndicies.map(
  (sliceIndex, i, arr) => input.slice(arr[i - 1] === undefined ? 0 : arr[i - 1] + 1, sliceIndex + 1)
);
console.log(chunked);

Upvotes: 2

Related Questions