Я делаю удаление по индексу массива. Так как делает удаление, как это:
delete arr[index];
Удалит индекс, но не повлияет на индекс массива, это то, что мне нужно для моей функциональности.
Проблема, с которой я сталкиваюсь, заключается в том, что ее длина не меняется:
console.log(arr.length);
Вернет тот же индекс, что и раньше. Есть ли способ получить фактическое количество значений, которые у меня есть в моем массиве, если я использовал функцию удаления?
Если вы уверены, что у вас нет никаких ложных ценностей. Тогда вы можете просто к этому:
arr.filter(Boolean).length
Однако вам потребуется лучшая функция фильтра для учета некоторых значений (например, 0
).
Да, но delete
это частично работа с массивом, это в основном для объекта. Вы можете использовать сращивание или фильтр для этого
arr.splice(index, 1);
или если вы хотите строгое с текущим решением, то получите длину таким образом.
var count = a.filter(val=>val != '').length;
Вместо этого вы можете использовать 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
Проблема здесь в том, что 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
значения, что хорошо, потому что вы не получите неправильных результатов, отфильтровав ложные значения по ошибке.
Я делаю удаление по индексу массива. Так как делает удаление, как это:
delete arr[index];
Удалит индекс, но не повлияет на индекс массива, это то, что мне нужно для моей функциональности.
"delete" изменяет значение элемента на неопределенное (https://www.w3schools.com/js/js_array_methods.asp), но фактически не удаляет элемент.
Если у вас нет проблем с оставлением неопределенных дыр в вашем массиве, вы можете сосчитать ваши элементы, которые не являются неопределенными, но это не очень хороший способ сделать что-то в imo.
Что вы можете сделать, это создать массив объектов, в котором вы указываете значение индекса при добавлении элемента. Затем вы сохраняете свой пользовательский индекс при удалении элемента массива
Если вы хотите сохранить индекс предыдущего массива, вы можете отфильтровать его только по мере необходимости, чтобы избавиться от ложных значений как undefined
и null
const arr = [1,2,3,4,5,6];
delete arr[1];
console.log(arr.filter(o => o).length);
arr.filter(Boolean).length
.