Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Как изменить аргумент функции, так чтобы он был виден во внешней области видимости?

#javascript


Функция partitionOn принимает 2 аргумента, pred — это функция задающая условия выборки
элементов из массива items.

Функция должна возвращать длину нового массива с элементами удовлетворяющими pred.
А также изменять массив items, который принимает в качестве аргумента. 

В моем коде items не изменяется во внешней области видимости. Как сделать чтобы он
изменялся?

В консоли пишу

window.items.concat(arrPredFalse, arrPredTrue);


и работает, но codewars выдает ошибку.

function partitionOn(pred, items) {
    var arrPredTrue = [];
    var arrPredFalse = [];
    for (var i = 0; i < items.length; i++) {
      if (pred(items[i])) {
        arrPredTrue.push(items[i]);
      } else {
        arrPredFalse.push(items[i]);
      }
    }
    items.concat(arrPredFalse, arrPredTrue);
    return arrPredTrue.length;
}

    


Ответы

Ответ 1



Функция concat в строке items.concat(arrPredFalse, arrPredTrue); Создает новый массив и возвращает его в никуда. При этом в исходном массиве изменений не происходит. Присвоение результата той же переменной items, также не отразится на глобальном массиве, из-за того, что в этом случае просто изменится ссылка на которую будет указывать параметр items. Чтобы изменения применились, нужно использовать функции непосредственно меняющие массив: push, splice items.push(...arrPredFalse, ...arrPredTrue); или items.splice(items.length, 0, ...arrPredFalse, ...arrPredTrue); В примерах выше используется spread operator, упрощающий передачу массива в качестве списка параметров. Без его использования нужно использовать apply items.push.apply(items, arrPredFalse.concat(arrPredTrue)); или items.splice.apply(items, [items.length, 0].concat(arrPredFalse,arrPredTrue));

Комментариев нет:

Отправить комментарий