Перебор элементов массива без циклов

29.10.2016

Примеры очень абстрактные, так как циклы существуют. Данная задача была поставлена на одном из собеседований. Необходимо было выбрать все элементы массива по заданному признаку. Есть несколько вариантов решения.

Наиболее правильным вариантом в PHP будет использование встроенной функции array_filter(). Но представим, что и ее тоже нет. Напишем свою используя рекурсию.

На PHP функция будет выглядеть так:

function getArrayElements($arr, $pattern) {
    static $i = 0;
    static $arrayResult = array();
    if (preg_match($pattern, $arr[$i])) {
        $arrayResult[] = $arr[$i];
    }
    $i++;
    if (count($arr) == $i) {
        return;
    } else {
        getArrayElements($arr, $pattern);
    }
    return $arrayResult;
}

Пример:

$arr = array('a', 'xd', 'w', 1, 'y', 'x');
$pattern = '/^x/';
print_r(getArrayElements($arr, $pattern)); // Array ( [0] => xd [1] => x )

Теперь разберем тоже самое, но уже на JavaScript. В JS у массива есть аналогичный метод filter(). Но попробуем обойтись без него, воспользуемся рекурсией

var i = 0, //вместо статических переменных
	arrayResult = [];

function getArrayElements(arr, pattern) {
    if (pattern.test(arr[i])) {
        arrayResult.push(arr[i]);
    }
    i++;
    if (arr.length == i) {
        return;
    } else {
        getArrayElements(arr, pattern);
    }
    return arrayResult;
}

Так как в JavaScript не статических переменных пришлось создать глобальные

Пример

 var arr = ['a', 'xd', 'w', 1, 'y', 'x'],
     pattern = /^x/;
     console.log(getArrayElements(arr, pattern)); //["xd", "x"]

Leave a Reply

*

code