Удалить пустые элементы из массива в Javascript

Оператором xor является ^

Например: SELECT A ^ B, где A и B являются целыми типами данных категории.

918
задан Josh Lee 10 February 2018 в 23:18
поделиться

8 ответов

РЕДАКТИРОВАНИЕ: на Этот вопрос ответили почти 9-летний назад, когда не было очень полезных встроенных методов в Array.prototype.

Теперь, конечно, я просто рекомендовал бы Вам использовать filter метод.

Берут в памяти, что этот метод возвратит Вас новый массив с элементами, которые передают критерии функции обратного вызова, которую Вы предоставляете ему, например, если Вы хотите удалить null или undefined значения:

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);

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

Один общий шаблон, который я часто вижу используемый, должен удалить элементы, которые являются falsy, которые включают пустую строку "", 0, NaN, null, undefined, и false.

можно просто передать filter метод, Boolean функция конструктора, или просто возвратить тот же элемент в функции критериев фильтра, например:

var filtered = array.filter(Boolean);

Или

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

обоими способами это работает, потому что filter метод в первом случае, вызовы Boolean конструктор как функция, преобразовывая значение, и во втором случае, filter метод внутренне преобразовывает возвращаемое значение обратного вызова неявно к [1 121].

, Если Вы работаете с разреженными массивами, и Вы пытаетесь избавиться от "дыр", можно просто использовать filter метод, передающий обратный вызов, который возвращает true, например:

var sparseArray = [0, , , 1, , , , , 2, , , , 3],
    cleanArray = sparseArray.filter(function () { return true });

console.log(cleanArray); // [ 0, 1, 2, 3 ]

Старый ответ: не делают этого!

я использую этот метод, расширяя собственный прототип Массива:

Array.prototype.clean = function(deleteValue) {
  for (var i = 0; i < this.length; i++) {
    if (this[i] == deleteValue) {         
      this.splice(i, 1);
      i--;
    }
  }
  return this;
};

test = new Array("", "One", "Two", "", "Three", "", "Four").clean("");
test2 = [1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,];
test2.clean(undefined);

Или можно просто продвинуть существующие элементы в другой массив:

// Will remove all falsy values: undefined, null, 0, false, NaN and "" (empty string)
function cleanArray(actual) {
  var newArray = new Array();
  for (var i = 0; i < actual.length; i++) {
    if (actual[i]) {
      newArray.push(actual[i]);
    }
  }
  return newArray;
}

cleanArray([1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,]);
756
ответ дан AndrewL64 10 February 2018 в 23:18
поделиться

Попробуйте это. Передайте его Ваш массив, и это возвратится с пустыми удаленными элементами. *Обновленный для обращения к ошибке, на которую указывает Jason

function removeEmptyElem(ary) {
    for (var i = ary.length - 1; i >= 0; i--) {
        if (ary[i] == undefined)  {
            ary.splice(i, 1);
        }       
    }
    return ary;
}
-4
ответ дан ochi 10 February 2018 в 23:18
поделиться

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

Вы могли сделать что-то вроде этого:

function removeFalsyElementsFromArray(someArray) {
    var newArray = [];
    for(var index = 0; index < someArray.length; index++) {
        if(someArray[index]) {
            newArray.push(someArray[index]);
        }
    }
    return newArray;
}

На самом деле вот более универсальное решение:

function removeElementsFromArray(someArray, filter) {
    var newArray = [];
    for(var index = 0; index < someArray.length; index++) {
        if(filter(someArray[index]) == false) {
            newArray.push(someArray[index]);
        }
    }
    return newArray;
}

// then provide one or more filter functions that will 
// filter out the elements based on some condition:
function isNullOrUndefined(item) {
    return (item == null || typeof(item) == "undefined");
}

// then call the function like this:
var myArray = [1,2,,3,,3,,,,,,4,,4,,5,,6,,,,];
var results = removeElementsFromArray(myArray, isNullOrUndefined);

// results == [1,2,3,3,4,4,5,6]

Вы получаете идею - у Вас могли тогда быть другие типы функций фильтра. Вероятно, больше, чем Вы нужно, но я чувствовал себя щедрым...;)

8
ответ дан Jason Bunting 10 February 2018 в 23:18
поделиться

Это работает, я протестировал его в AppJet (Вы можете вставка копии код его IDE и нажимать "перезагрузку", чтобы видеть, что он работает, не должен создавать учетную запись)

/* appjet:version 0.1 */
function Joes_remove(someArray) {
    var newArray = [];
    var element;
    for( element in someArray){
        if(someArray[element]!=undefined ) {
            newArray.push(someArray[element]);
        }
    }
    return newArray;
}

var myArray2 = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];

print("Original array:", myArray2);
print("Clenased array:", Joes_remove(myArray2) );
/*
Returns: [1,2,3,3,0,4,4,5,6]
*/
1
ответ дан Joe Pineda 10 February 2018 в 23:18
поделиться
  • 1
    был бы это сначала " клон мерзавца - local" будьте лучше как " клон мерзавца - no-hardlinks" чтобы заставить его явно очистить это, это должна быть глубокая копия? – Dave Amphlett 2 August 2011 в 10:40

Если у Вас есть Javascript 1.6, или позже можно использовать Array.filter использование тривиального return true функция обратного вызова, например:

arr = arr.filter(function() { return true; });

с тех пор .filter автоматически пропуски недостающие элементы в исходном массиве.

страница MDN, связанная выше также, содержит хорошую версию проверки ошибок filter, который может использоваться в интерпретаторах JavaScript, которые не поддерживают официальную версию.

Примечание, которое это не удалит null записи, ни записи с явным undefined значение, но OP конкретно требуемые "недостающие" записи.

117
ответ дан Alnitak 10 February 2018 в 23:18
поделиться
  • 1
    может кто-либо с большим знанием, чем я подтверждать это? @sage, если я просто хочу скопировать свой каталог (который содержит мой .git) вставкой копии к карте с интерфейсом USB, которая не была бы достаточно? – nutty about natty 31 March 2013 в 17:05

@Alnitak

На самом деле Array.filter работает над всеми браузерами, если Вы добавляете некоторый дополнительный код. Посмотрите ниже.

var array = ["","one",0,"",null,0,1,2,4,"two"];

function isempty(x){
if(x!=="")
    return true;
}
var res = array.filter(isempty);
document.writeln(res.toJSONString());
// gives: ["one",0,null,0,1,2,4,"two"]  

Это - код, который необходимо добавить для IE, но фильтр и Функциональная programmingis ценность являются imo.

//This prototype is provided by the Mozilla foundation and
//is distributed under the MIT license.
//http://www.ibiblio.org/pub/Linux/LICENSES/mit.license

if (!Array.prototype.filter)
{
  Array.prototype.filter = function(fun /*, thisp*/)
  {
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();

    var res = new Array();
    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this)
      {
        var val = this[i]; // in case fun mutates this
        if (fun.call(thisp, val, i, this))
          res.push(val);
      }
    }

    return res;
  };
}
15
ответ дан Erik Johansson 11 February 2018 в 09:18
поделиться
  • 1
    @DaveS: Просто не упустите то, что передача 0 в списке vararg НЕ является тем же как передающим ПУСТЫМ УКАЗАТЕЛЕМ. Никакое преобразование типов не сделано, потому что компилятор не знает, что 0 входит в указатель. Это может привести к передаче 32-разрядного целого числа 0 в 64-разрядный слот указателя и порождение головных болей. – Zan Lynx 28 August 2013 в 18:29

Фильтрация недопустимых записей с помощью регулярного выражения

array = array.filter(/\w/);
filter + regexp
0
ответ дан 19 December 2019 в 20:20
поделиться

Простые способы:

var arr = [1,2,,3,,-3,null,,0,,undefined,4,,4,,5,,6,,,,];


arr.filter(n => n)
// [1, 2, 3, -3, 4, 4, 5, 6]

arr.filter(Number) 
// [1, 2, 3, -3, 4, 4, 5, 6]

arr.filter(Boolean) 
// [1, 2, 3, -3, 4, 4, 5, 6]

или - (только для одиночных элементов массива типа "текст")

['','1','2',3,,'4',,undefined,,,'5'].join('').split(''); 
// output:  ["1","2","3","4","5"]

или - Классический способ: простая итерация

var arr = [1,2,null, undefined,3,,3,,,0,,,[],,{},,5,,6,,,,],
    len = arr.length, i;

for(i = 0; i < len; i++ )
    arr[i] && arr.push(arr[i]);  // copy non-empty values to the end of the array

arr.splice(0 , len);  // cut the array and leave only the non-empty values

arr // [1,2,3,3,[],Object{},5,6]


через jQuery:

var arr = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];

arr = $.grep(arr,function(n){ return n == 0 || n });

arr // [1, 2, 3, 3, 0, 4, 4, 5, 6]


ОБНОВЛЕНИЕ - еще один быстрый, крутой способ (с использованием ES6):

var arr = [1,2,null, undefined,3,,3,,,0,,,4,,4,,5,,6,,,,], 
    temp = [];

for(let i of arr)
    i && temp.push(i); // copy each non-empty value to the 'temp' array

arr = temp;

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

Удалить пустые значения

['foo', '',,,'',,null, ' ', 3, true, [], [1], {}, undefined, ()=>{}].filter(String)

// ["foo", null, " ", 3, true, [1], Object {}, undefined, ()=>{}]
1323
ответ дан 19 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: