Как удалить нулевые значения из вложенных массивов - PullRequest
0 голосов
/ 22 ноября 2018

Этот код удаляет все нулевые значения из массива:

var array = [ 0, 1, null, 2, "", 3, undefined, 3,,,,,, 4,, 4,, 5,, 6,,,, ];

var filtered = array.filter(function (el) {
  return el != null;
});

console.log(filtered);

Но когда я пробую это на массиве с вложенными массивами, которые имеют нулевые значения, нули не удаляются:

var array = [ [ 1, null, 2 ], [ 3, null, 4 ], [ 5, null, 6 ] ];

var filtered = array.filter(function (el) {
  return el != null;
});

console.log(filtered);

Ожидаемый вывод:

[ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ] ]

Вместо фактического вывода:

[ [ 1, null, 2 ], [ 3, null, 4 ], [ 5, null, 6 ] ]

Как изменить примеротфильтровать нулевые значения из вложенных массивов?

Ответы [ 5 ]

0 голосов
/ 22 ноября 2018

Вы, например, удаляете значения undefined, а также значения null, и ваш ожидаемый результат отражает это, поэтому я собираюсь предположить, что вы хотите рекурсивно удалить оба значения undefined и nullценности.В вашем примере используется сравнение свободного равенства , что означает, что оно будет соответствовать null и undefined.Хотя это работает , гораздо лучше четко указать, что вы проверяете, с помощью строгого сравнения на равенство, используя ===.

Вам понадобится рекурсия:

Рекурсия

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

- https://developer.mozilla.org/en-US/docs/Glossary/Recursion

Это также означает, что вы захотите использовать Array#reduce вместо Array#filter.Используйте новый массив в качестве аккумулятора.

Затем для каждого элемента во входном массиве, где элемент не равен нулю или не определен:

  • , если элемент является экземпляром Array, отправьте результат вызова этой функции наэлемент на массив аккумуляторов,
  • в противном случае поместите элемент на массив аккумуляторов

Вернуть массив аккумуляторов в конце обратного обратного вызова в качестве аккумулятора

const input = [ [ 1, null, 2 ], null,,,,, [ 3, null, 4 ],,,,, [ 5, null, 6 ],,,,, [ 7, [ 8, undefined, 9 ], 10 ] ]

function recursiveValues(input) {
  if(!(input instanceof Array)) return null
  return input.reduce((output, element) => { 
     if(element !== null && element !== undefined) {
        if(element instanceof Array) {
            output.push(recursiveValues(element))
        } else {
            output.push(element)
        }
    }
    return output
  }, [])
}

const output = recursiveValues(input)

console.log(JSON.stringify(output))
0 голосов
/ 22 ноября 2018

Вам нужно рекурсивно фильтровать ноль, например так:

function removeNull(array) {
  return array
    .filter(item => item !== null)
    .map(item => Array.isArray(item) ? removeNull(item) : item);
}

Эта функция принимает массив и рекурсивно удаляет все экземпляры нуля.

Сначала я выбрал ваше решение иобернул его в функцию, чтобы его можно было вызвать.

Затем, после того, как элементы отфильтрованы, это так же просто, как отобразить оставшиеся элементы, проверить, является ли каждый массив массивом, а затем для каждого из них, вызвать на нем removeNull.

РЕДАКТИРОВАТЬ : Первоначально в моем коде была опечатка, но теперь она должна работать.

0 голосов
/ 22 ноября 2018

Если ваш массив массивов имеет только один уровень, то вы можете просто map это так:

var filtered = array.map(subarray => subarray.filter(el => el != null));
console.log(filtered);
0 голосов
/ 22 ноября 2018
var arraylist = [0, 1, null, 5];
var i = arraylist.length;
var j =0;
var newlist = [];

while(j < i){

if(arraylist[j] != null){

    newlist.push(arraylist[j]);

}

j++;
}

console.log(newlist);

https://jsfiddle.net/L4nmtg75/

0 голосов
/ 22 ноября 2018
var filterFn = function(item) {
    if (item instanceof Array) {
        // do this if you want to remove empty arrays:
        var items = item.splice(0).filter(filterFn);
        var length = items.length;
        Array.prototype.push.apply(item, items);
        return length;
        // if you want to keep empty arrays do this:
        var items = item.splice(0);
        Array.prototype.push.apply(item, items.filter(filterFn))
        return true;
    }
    return item != null;
};
array = array.filter(filterFn);

Это также будет работать на более чем 2 уровне, поскольку это рекурсивно.

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