Как выбирать по 5 элементов из общего массива?

Рейтинг: 1Ответов: 1Опубликовано: 10.03.2023

У меня есть функция которая забирает элементы из массива (по 5 штук), эта функция может вызываться сразу из разных мест и сколько угодно раз. И есть общий массив данных. Мне нужно чтобы эта функция на каждый вызов выбирала только те элементы, из общего массива, которые еще не были выбраны ранее. Поэтому прямо в этой функции я сделал удаление элемента массива.

Получилось так:

    let emails = [];
    for (let index = 1; index <= 20; index++) {
        emails.push({'email':`${index}@gmail.com`});
    }
    
    start();
    
    function start() {
        let data = generatePost();
        if (data.length === 0) {
            return true;
        }
        console.log(data);
        start();
    }

    function generatePost() {
        let post = [];
        let add = 0;
        for (let index = 0; index < emails.length; index++) {
            post.push( emails[index].email );
            emails.splice(index, 1);
            add++;
            if (add === 5) {
                break;
            }
        }
        return post;
    }

В итоге, как можно увидеть, выбираются элементы не по порядку, а в конце вообще получается по одному элементу, хотя хотелось бы чтобы было по 5. Я понимаю что это splice перестраивает индексы... Но не совсем понимаю как решить это.

Буду благодарен за помощь!

Ответы

▲ 1Принят

splice мутирует массив. Поэтому обход массива в цикле с применением splice как раз приводит к такому поведению. На второй итерации вы получаете 3й элемент от исходного массива, хотя на самом деле это уже второй элемент.

Воспользутесь всеми возможностями метода splice. splice возвращает удаленные элементы. Ваша фукнция может выглядеть вот так:

function generatePost() {
  return emails.splice(0, 5);
}