Почему метод filter не удаляет все элементы массива?

#javascript #node.js #ecmascript-6

#javascript #node.js #ecmascript-6

Вопрос:

 this.arol.filter(x=>x.length!==0
                ?(this.arol.splice(this.arol.indexOf(x),1))
                :!true)
  

Я пытался изменить его множеством разных способов, но он по-прежнему не удаляет все элементы массива, он всегда оставляет 1 или 2 после удаления большинства из них…. Я думаю, что проблема в условии… Мы проверяем, не равна ли длина элементов массива 0 (которые являются всеми строками)…

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

1. !true ? Позвольте мне представить моего друга false .

2. Никогда не используйте splice во время итерации. Почему вы просто не используете arol = arol.filter(…) ?

Ответ №1:

Не пытайтесь делать это splice во время filter ввода — вместо этого верните из filter обратного вызова значение true или falsey, в зависимости от того, хотите ли вы включить элемент, который повторяется, в новый массив, и используйте результирующий массив, который возвращается из .filter :

 this.arol = this.arol.filter(x => x.length !== 0);
^^^^^^^^^^^^
  

Ответ №2:

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

 const arr = [[1],[],[2]]
arr.reduceRight((_,c,i) => c.length || !!arr.splice(i,1))

console.log(arr)  

Ответ №3:

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

Вы можете присвоить результат тому же массиву, который предлагается CertainPerformance.

Ответ №4:

Если Splice удален из этого кода, то он не будет удалять элементы. this.arol.splice(this.arol.indexOf(x),1) здесь он будет проходить через каждый элемент внутри этого массива и x будет текущей итерацией, которая будет сращиваться из массива, как вы написали метод сращивания. Удалите splice , он будет работать нормально.