Как подсчитать все значения в массиве в Javascript, если я использую Delete

1

Я делаю удаление по индексу массива. Так как делает удаление, как это:

delete arr[index];

Удалит индекс, но не повлияет на индекс массива, это то, что мне нужно для моей функциональности.

Проблема, с которой я сталкиваюсь, заключается в том, что ее длина не меняется:

console.log(arr.length);

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

  • 1
    если у вас нет значений, которые являются ложными (0 и т. д.). Тогда вы можете сделать arr.filter(Boolean).length .
  • 0
    Отлично, это все, что мне нужно, вы можете оставить свой комментарий, чтобы я мог пометить его как ответ. :)
Показать ещё 3 комментария
Теги:
arrays

6 ответов

0
Лучший ответ

Если вы уверены, что у вас нет никаких ложных ценностей. Тогда вы можете просто к этому:

arr.filter(Boolean).length

Однако вам потребуется лучшая функция фильтра для учета некоторых значений (например, 0).

1

Да, но delete это частично работа с массивом, это в основном для объекта. Вы можете использовать сращивание или фильтр для этого

arr.splice(index, 1);

или если вы хотите строгое с текущим решением, то получите длину таким образом.

var count  = a.filter(val=>val != '').length;
1

Вместо этого вы можете использовать splice, в вашем случае:

arr.splice(index, 1);

Попробуй это:

let arr=[1, 2, 3, 4, 5]; //length 5
arr.splice(0, 1); //length 4

Обновить

Если вы хотите сохранить индексы внутри массива, зная фактическое количество значений внутри массива, я предлагаю вам сделать простой трюк, поддерживая значение counter:

delete arr[index];
counter--;

и вместо чтения arr.length вы можете просто использовать counter

  • 0
    Проблема со сплайсом в том, что другой индекс массива изменен. Я не хочу, чтобы индекс других массивов был изменен.
  • 0
    Итак, вы хотите узнать фактическую длину массива, не влияя на индекс?
Показать ещё 2 комментария
1

Проблема здесь в том, что delete удаляет элемент из массива, но не влияет на длину.

Чтобы получить истинную длину, вы можете просто подсчитать все непустые элементы в массиве. Что-то простое, как это будет работать:

function getLengthWithoutEmptyElements (array) {
  return array.filter(() => true).length;
}

const arr = [0, 1, 2, 3];
delete arr[2];

console.log(arr.length) // 4, unchanged (bad)
console.log(getLengthWithoutEmptyElements(arr)) // 3, correct (good)

Это работает, потому что, хотя empty элемент все еще существует в вашем массиве, его на самом деле больше нет (все ссылки на него были уничтожены, когда вы вызвали delete).

Итак, если вы отфильтруете массив и вернете true для каждого элемента, который на самом деле в нем, вы получите массив без пустых элементов - поэтому мы можем просто получить длину этого.

Заметка

Этот подход array.filter(() => true).length работает на всех входах, поскольку он будет игнорировать только empty значения, что хорошо, потому что вы не получите неправильных результатов, отфильтровав ложные значения по ошибке.

0

Я делаю удаление по индексу массива. Так как делает удаление, как это:

delete arr[index];

Удалит индекс, но не повлияет на индекс массива, это то, что мне нужно для моей функциональности.

"delete" изменяет значение элемента на неопределенное (https://www.w3schools.com/js/js_array_methods.asp), но фактически не удаляет элемент.

Если у вас нет проблем с оставлением неопределенных дыр в вашем массиве, вы можете сосчитать ваши элементы, которые не являются неопределенными, но это не очень хороший способ сделать что-то в imo.

Что вы можете сделать, это создать массив объектов, в котором вы указываете значение индекса при добавлении элемента. Затем вы сохраняете свой пользовательский индекс при удалении элемента массива

0

Если вы хотите сохранить индекс предыдущего массива, вы можете отфильтровать его только по мере необходимости, чтобы избавиться от ложных значений как undefined и null

const arr = [1,2,3,4,5,6];
delete arr[1];
console.log(arr.filter(o => o).length);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню