JavaScipt - Массив фильтров с мутацией - PullRequest
0 голосов
/ 24 мая 2019

Я хочу отфильтровать массив, сохранив тот же массив без создания нового.

с Array.filter():

getFiltersConfig() {
  return this.config.filter((topLevelConfig) => topLevelConfig.name !== 'origin')
}

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

Ответы [ 3 ]

1 голос
/ 24 мая 2019

Для полноты я подумал, что может иметь смысл показать измененный вариант массива.

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

Также пара тестов, чтобы показать, как Array.filter создает новый массив, а mutationFilter - нет.

Хотя в большинстве случаев создание нового массива с Array.filter - это обычно то, что вам нужно. Одним из преимуществ использования мутированного массива является то, что вы можете передавать массив по ссылке, без необходимости заключать массив в другой объект. Конечно, еще одним преимуществом является память, если бы ваш массив был огромным, встроенная фильтрация заняла бы меньше памяти.

let arr = ['a','b','a'];
let ref = arr; //keep reference of original arr

function mutationFilter(arr, cb) {
  for (let l = arr.length - 1; l >= 0; l -= 1) {
    if (!cb(arr[l])) arr.splice(l, 1);
  }
}

const cond = x => x !== 'a';

const filtered = arr.filter(cond);
mutationFilter(arr, cond);

console.log(`ref === array -> ${ref === arr}`);
console.log(arr);

console.log(`ref === filtered -> ${ref === filtered}`);
console.log(filtered);
1 голос
/ 24 мая 2019

Не знаю, зачем вам нужна мутация, но если вы действительно хотите это сделать, возможно, верните ее себе?

let arr = ['a','b','a'];

arr = arr.filter(x => x !== 'a');

console.log(arr)
0 голосов
/ 24 мая 2019

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

if(!Array.prototype.filterThis){
  Array.prototype.filterThis = function (callBack){
          if(typeof callBack !== 'function')
              throw new TypeError('Argument must of type <function>');
    let t = [...this];
    this.length = 0;
    for(let e of t) if(callBack(e)) this.push(e);
          return this;
  }
}

let a = [1,2,3,4,5,5,1,5];
a.filterThis(x=>x!=5);
console.log(a);

Предупреждение: будьте очень осторожны при изменении встроенных прототипов.Я бы даже сказал, если вы не сделаете полифилл, не трогайте.Ошибки, которые это может вызвать, могут быть очень тонкими и очень сложными для отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...