Следует ли проверять значение в массиве Javascript перед удалением? - PullRequest
1 голос
/ 05 июня 2019

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

Предполагается, что

function arrayRemove(arr, value) {   
   return arr.filter(function(ele){       
      return ele != value;
});

var array = ['a', 'b', 'c', 'd'];

просто использует

var result = arrayRemove(array, 'b');

Более уместно, чем предварительная проверка его существования

if (array.includes('b')) 
    var result = arrayRemove(array, 'b');

Первый - чищеи меньше операций, но последний не всегда будет запускать фильтр.

Ответы [ 5 ]

1 голос
/ 05 июня 2019

Я создал JS Perf для этого. Похоже, что просто вызов функции arrayRemove перед проверкой, существует ли значение, лучше.

Простой тест:

const arr = Array(10000000).fill(Math.random());
arr[10000] = 'e';

let start = Date.now();
const arr2 = arr.filter(v => v !== 'd');
console.log('filter time', Date.now() - start); // --- filter time 1168ms

start = Date.now();
if (arr.includes('e')) {
  console.log('includes time', Date.now() - start); // --- includes time 1ms
}

Итак, как вы можете видеть, действительно ли массив большой, если будет намного быстрее

https://jsperf.com/js-array-filter/1

1 голос
/ 05 июня 2019

Я бы сказал, var result = arrayRemove(array, 'b'); лучше, потому что это:

if (array.includes('b'))

будет перебирать массив, и если он найдет b, то это:

var result = arrayRemove(array, 'b');

итерирует массив снова, чтобы удалить его, поэтому у вас есть две итерации, если элемент существует, и одна, если его нет.Использование arrayRemove(array, 'b') напрямую будет повторять только один раз в обоих случаях.

0 голосов
/ 05 июня 2019

Функция Array.filter создает новый массив - поэтому он всегда будет потреблять больше ресурсов, чем если.

Простой тест:

const arr = Array(10000000).fill(Math.random());
arr[10000] = 'e';

let start = Date.now();
const arr2 = arr.filter(v => v !== 'd');
console.log('filter time', Date.now() - start); // --- filter time 1168ms

start = Date.now();
if (arr.includes('e')) {
  console.log('includes time', Date.now() - start); // --- includes time 1ms
}

Так что вы можете видеть, является ли массивочень большой, если бы был намного быстрее

0 голосов
/ 05 июня 2019

Я пойду с , предварительно не проверяя его существование , потому что .filter заботится о значениях, отсутствующих в массиве. Однако, если вы не выполняете .filter и не пытаетесь выполнить итерацию массива для конкретной операции значения ключа, используя for или while, рекомендуется проверить наличие значения.

function arrayRemove(arr, value) {
  return arr.filter(function(ele) {
    return ele != value;
  });
}
  var arry = ['a', 'c', 'd'];

  console.log(arrayRemove(arry,'b'));
0 голосов
/ 05 июня 2019

Лучше делать с предоставленными встроенными методами splice() Этот метод используется для добавления / удаления элементов в / из массива и возврата удаленных элементов из массива.Вы можете узнать больше о Splice здесь. сращивания

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