Фильтр списка с двоичным шаблоном - PullRequest
1 голос
/ 27 марта 2020

let listFilter = [0,7,5,4,1,3,5];
let pattern = [0,1,0,0];


function FilterByPattern(listToFilter, pattern){
    let variable = 0;

    while(variable < listToFilter.length){
        for(i of pattern){
            if(variable < listToFilter.length){
                if(i == 0){
                    listToFilter.splice(variable,1);
                }else{
                    variable += 1;
                }
            }else{
                break;
            }
        }
    }
    return listToFilter;
}

console.log(FilterByPattern(listFilter, pattern))

Привет,

Мне интересно, есть ли более элегантный способ фильтрации списка с другим шаблоном списка (из 1 и 0)? ), как сделано выше.

Проблема с кодом заключается в том, что он выполняет больше итераций, чем количество элементов listToFilter. Я пытаюсь сделать это без необходимости создания какого-либо другого списка.

Спасибо!

1 Ответ

3 голосов
/ 27 марта 2020

Вы можете отфильтровать массив, взяв значение шаблона, используя оператор остатка и длину шаблона в качестве индекса.

const
    filterByPattern = (array, pattern) => array.filter((_, index) =>
        pattern[index % pattern.length]);

console.log(filterByPattern([0, 7, 5, 4, 1, 3, 5], [0, 1, 0, 0]));

Мутантный подход с сохранением массива.

const
    filterByPattern = (array, pattern) => {
        let index = array.length;

        while (index--) 
            if (!pattern[index % pattern.length])
                array.splice(index, 1);

        return array;
    };

console.log(filterByPattern([0, 7, 5, 4, 1, 3, 5], [0, 1, 0, 0]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...