Как я могу разделить мой массив на несколько массивов, основываясь на значении Javascript? - PullRequest
1 голос
/ 29 января 2020

У меня есть массив, и я хочу разделить его на несколько массивов на основе значения «Завершено», когда я его найду, я разделю массив.

Мой код:

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));

при запуске я получаю:

enter image description here

Но я хочу, чтобы результат был :

[["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"]]

Когда я нахожу Finished, я разделяю свой массив на основе ее индекса, вы можете увидеть мой код в jsbin https://jsbin.com/benozuyutu/1/edit?js, console

Как я могу это исправить?

Ответы [ 5 ]

2 голосов
/ 29 января 2020

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)
2 голосов
/ 29 января 2020

Вы можете найти все вхождения Finished с помощью .reduce, а затем создать новый массив путем .slice каждого вхождения в найденных признаках:

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);
1 голос
/ 29 января 2020

Вы можете использовать reduce метод. В методе reduce необходимо проверить, существует ли ключевое слово для поиска и существует ли pu sh во вновь создаваемый массив. В противном случае мы добавляем в существующий массив:

let keywordToFind = 'urlGettingF';

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

Пример:

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);
1 голос
/ 29 января 2020

Вы можете использовать следующий алгоритм.

  1. Найти indexOf('Finished')
  2. Используйте функцию Array.splice, чтобы получить значения до index. .splice также обновляет существующий массив.
  3. Делайте выше, пока indexOf('Finished') > -1
  4. Наконец, добавьте оставшиеся input array в 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);
1 голос
/ 29 января 2020

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));
...