Видаліть порожні елементи з масиву в Javascript


1144

Як видалити порожні елементи з масиву в JavaScript?

Чи є прямий спосіб, чи мені потрібно провести цикл через нього та видалити їх вручну?


14
Було б корисно, якби у вашому запитанні було вказано саме те, що ви маєте на увазі під "порожніми елементами", оскільки більшість відповідей тут трактують це неправильно (ІМХО) як "фальсифіковані" елементи. NB: Є різниця між тим, що ви отримуєте за var a = [,,]та var a = [undefined, undefined]. Перший справді порожній, але останній насправді має два ключі, але зі undefinedзначеннями.
Альнітак

Відповіді:


1064

EDIT: На це питання відповіли майже дев'ять років тому, коли в програмі не було багато корисних вбудованих методів 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метод внутрішньо повертає повернене значення зворотного виклику неявно Boolean.

Якщо ви працюєте з розрідженими масивами, і ви намагаєтеся позбутися "дірок", ви можете використовувати filterметод передачі зворотного виклику, який повертає істину, наприклад:

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

110
ПОПЕРЕДЖЕННЯ. Другий варіант видалить будь-які елементи з масиву, який вважається "хибним", тобто значення false, 0, null & undefined. Цей масив закінчився б нічого в ньому: [null ,,, 0,, ​​0,0,0, false, null, 0], хоча я, можливо, хотів би елементи зі значеннями 0, як у цьому масиві: [ 1,0,1,0,0,1]
Джейсон Бантінг

5
Я усвідомлюю це - саме тому я говорив лише про другий варіант. Що стосується першого, він настільки вузький за обсягом, що я б вагався, щоб зробити його частиною прототипу масиву. Дивіться відповідь Альнітака на цій сторінці про щось ідеальне. З Вами, правда, допускається зав'язування.
Джейсон Бантінг

1
Ваше перше рішення дуже приємне, якщо у вас немає доступу до методу "фільтр". Ще я вважаю, що відповідь Альнітака краща.
Джо Пінеда

2
@AlfaTek - у всіх, окрім останніх браузерів №2, буде найкраща продуктивність, оскільки масиви в JS насправді не є масивами. spliceВиклик дійсно дорого на старих браузерах , тому що вони повинні пронумерувати всі ключі масиву , щоб закрити цю прогалину.
Альнітак

1
@David ні, в сучасному коді вам слід сміливо розширити Array.prototypeвикористання, Object.definePropertyщоб зробити нову функцію незліченною властивістю, а потім уникнути хітів продуктивності, спричинених введенням .hasOwnPropertyу кожен цикл.
Альнітак

1381

Прості способи:

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, ()=>{}]

34
Найперша підтримка IE для фільтра - це режим IE9.
yincrash

14
для чистого JavaScript він повинен бутиarr = arr.filter(function(n){return n; });
ilumin

19
foo.join("").split("")Здається, працює лише в тому випадку, якщо рядки є єдиними символами
Atav32

9
Ваш чистий код JavaScript має помилку. Якщо масив має значення "0", це значення буде відфільтровано, оскільки "0" є хибним. Що ви хочете, це: arr.filter (function (n) {return (n! == undefined && n! == null);});
Джон Курлак

5
ES6 може зробити це ще простіше, arr.filter(e=>e)і це можна
зв'язати

241

Якщо вам потрібно видалити ВСІ порожні значення ("", null, undefined та 0):

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

Щоб видалити порожні значення та розриви рядків:

arr = arr.filter(function(e){ return e.replace(/(\r\n|\n|\r)/gm,"")});

Приклад:

arr = ["hello",0,"",null,undefined,1,100," "]  
arr.filter(function(e){return e});

Повернення:

["hello", 1, 100, " "]

ОНОВЛЕННЯ (на основі коментаря Alnitak)

У деяких ситуаціях ви можете зберегти "0" в масиві та видалити що-небудь інше (null, undefined and ""), це один із способів:

arr.filter(function(e){ return e === 0 || e });

Повернення:

["hello", 0, 1, 100, " "]

Але це добре, тому що "" також знімає "".
Владимир

3
Тестова функція може бути дещо чіткішою:function(e){return !!e}
Коен.

4
@Koen Зверніть увагу, що він !!eбуде включати NaN (на відміну від 0), де eне буде (як 0).
Sheepy

Насправді не відповідає на поставлене запитання.
Альнітак

2
АБО використання var myarr=[1, 2,, 3,, 3,undefined,,"",,0, 4,, 4,, 5,, 6,,,,].filter(Boolean);видаляє невизначені, "" та 0
Марк Шультейс

134

Просто один вкладиш:

[1, false, "", undefined, 2].filter(Boolean); // [1, 2]

або за допомогою underscorejs.org :

_.filter([1, false, "", undefined, 2], Boolean); // [1, 2]
// or even:
_.compact([1, false, "", undefined, 2]); // [1, 2]

1
Це дуже здорово - у мене є питання про новомовлення: схоже, ви використовуєте ім'я класу як виклик функції - це типовий мовлення? Я цього раніше не бачив і не впевнений, я розумію, чому передача Booleanпрацює як функція ...
Ендрю

8
Якщо ви розглядаєте її Booleanяк функцію, вона просто поверне trueабо falseзміцнить значення по-справжньому / помилково.
andlrc

8
Ви не розглядаєте булеву функцію; вона є функцією. (Цілком нормальна функція, за винятком того, що вона втілена в життя.) Комусь потрібно зробити невелике дослідження об’єктної моделі JavaScript. ;)
ELLIOTTCABLE

@ELLIOTTCABLE Я просто збираюся залишити це тут, (true).constructor === Boolean. А потім скажіть, чи можемо ми це зробити за допомогою інших вбудованих програм в JS. ;)) (звичайно виключаються інші 5 вбудованих конструкторів. (Рядок, масив, об'єкт, функція, число))
andlrc

1
Не вдасться обох, якщо в масиві буде значення 0
Сай Рам

129

Якщо у вас Javascript 1.6 або пізнішої версії, ви можете використовувати Array.filterза допомогою тривіальної return trueфункції зворотного виклику, наприклад:

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

оскільки .filterавтоматично пропускає відсутні елементи в початковому масиві.

Сторінка MDN, пов'язана вище, також містить приємну версію перевірки помилок, filterяку можна використовувати в інтерпретаторах JavaScript, які не підтримують офіційну версію.

Зауважте, що це не буде видаляти nullзаписи та записи з явним undefinedзначенням, але ОП спеціально вимагає "відсутні" записи.


Ти правий! Це може бути так просто, як це (і працює!): Test3 = [1,2,, 3,, 3 ,,,, 7 ,,, 7 ,,, 0 ,,, 4, 4,, 5 ,, 6,, невизначений ,, null ,,]; printp ("Використання нативної фільтрації масиву:", test3.filter (функція (значення) {return (значення == undefined)? 0: 1;}));
Джо Пінеда

3
+1 Як сказав Алнитак, у них є код, який можна використовувати у випадку відсутності js 1.6
Sameer Alibhai

3
@katsh Я уточнив - код вище робить роботу для видалення записів , для яких значення не існує взагалі, що (я згодом) дізнався семантично відрізняється від випадку ключа , який існує , але має в undefinedякості заданого значення.
Альнітак

4
Щоб видалити невизначені або нульові записи, просто зробіть невелику модифікацію ... arr = arr.filter (function (v) {return v;});
Alan CN

4
@AlanCN ти повністю пропустив мою думку. ОП попросила видалити пропущені записи, тоді як основна частина відповідей (неправильно) видалила будь-які записи "фальси".
Альнітак

65

Для видалення отворів слід використовувати

arr.filter(() => true)
arr.flat(0) // Currently stage 3, check compatibility before using this

Для видалення отвору та значень фальш (null, undefined, 0, -0, NaN, "", false, document.all):

arr.filter(x => x)

Для видалення отвору, null та, undefined:

arr.filter(x => x != null)

arr = [, null, (void 0), 0, -0, NaN, false, '', 42];
console.log(arr.filter(() => true)); // [null, (void 0), 0, -0, NaN, false, '', 42]
console.log(arr.filter(x => x)); // [42]
console.log(arr.filter(x => x != null)); // [0, -0, NaN, false, "", 42]


3
Це повинно бути високо у відповіді. Чи можете ви розширити, що ви маєте на увазі під дірками / діркою?
samayo

2
@samayo дірки - це незаповнені масиви, тобто[, ,]
Джиммі Обоніо, або

Використовуючи arr.filter(x => x), JS перевірить, чи х є правдою чи хибністю, тобто if (x), тому нове перелік буде присвоєно лише значення трикути.
КуанЮ Чу

56

Чистий спосіб це зробити.

var arr = [0,1,2,"Thomas","false",false,true,null,3,4,undefined,5,"end"];
arr = arr.filter(Boolean);
// [1, 2, "Thomas", "false", true, 3, 4, 5, "end"]

5
Порожні елементи є undefined; це в основному видаляє всі помилкові значення.
pimvdb

33

Простий ES6

['a','b','',,,'w','b'].filter(v => v);

1
Це не працює: [1, 'two', null, undefined, , NaN, false, true, 0].filter(v => v).
блискавка

22

З підкресленням / Лодаш:

Загальний випадок використання:

_.without(array, emptyVal, otherEmptyVal);
_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);

З порожніми місцями:

_.without(['foo', 'bar', '', 'baz', '', '', 'foobar'], '');
--> ["foo", "bar", "baz", "foobar"]

Дивіться документацію lodash для без .


Проблема з #compact полягає в тому, що він видаляє помилкові значення. Тож якщо ваш масив містить 0 значень, вони також будуть видалені.
Самуель Брандао

21

Просто ES6і новіші версії методу, припустимо, масив нижче:

 const arr = [1,2,3,undefined,4,5,6,undefined,7,8,undefined,undefined,0,9];

Простий спосіб:

 const clearArray = arr.filter( i => i );

16

Якщо використання бібліотеки - це варіант, я знаю, що underscore.js має функцію, що називається компактний () http://documentcloud.github.com/underscore/, він також має кілька інших корисних функцій, пов'язаних з масивами та колекціями.

Ось уривок з їх документації:

_.compact (масив)

Повертає копію масиву із видаленими фальшивими значеннями. У JavaScript, false, null, 0, "", undefined та NaN - все помилково.

_.compact ([0, 1, false, 2, '', 3]);

=> [1, 2, 3]


Він також видаляє непусті елементи, визначені елементами на зразок 0.
Тимофій Гу

15

@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, але фільтр та функціональне програмування варто 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;
  };
}

Це має бути прийнятою відповіддю, оскільки це працює нестандартно. Дуже дякую.
Тоні

@Тон ні, це не повинно, тому що елемент із порожнім рядком у ньому не є тим самим, як "порожній елемент", останній - те, про що вимагав ОП.
Альнітак

14

Оскільки ніхто більше не згадував про це, і більшість людей підкреслили їхній проект, який ви також можете використовувати _.without(array, *values);.

_.without(["text", "string", null, null, null, "text"], null)
// => ["text", "string", "text"]


8

Можливо, вам буде простіше перевести цикл на масив і створити новий масив з елементів, які ви хочете зберегти з масиву, ніж намагаючись циклічно і з’єднувати, як було запропоновано, оскільки змінюєте довжину масиву під час його циклу може ввести проблеми.

Ви можете зробити щось подібне:

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]

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


7

Як щодо цього (ES6): Щоб видалити значення маси Falsy з масиву.

var arr = [0,1,2,"test","false",false,true,null,3,4,undefined,5,"end"];

arr.filter((v) => (!!(v)==true));

//output:

//[1, 2, "test", "false", true, 3, 4, 5, "end"]

6

Слід використовувати фільтр, щоб отримати масив без порожніх елементів. Приклад на ES6

const array = [1, 32, 2, undefined, 3];
const newArray = array.filter(arr => arr);

3

Я просто додати свій голос до вищесказаного «заклик ES5 - х Array..filter()з глобальним конструктора» гольф-хака, але я пропоную використовувати Objectзамість String, Booleanабо , Numberяк було запропоновано вище.

Зокрема, ES5 filter()вже не спрацьовує для undefinedелементів масиву; тому функція, яка універсально повертається true, яка повертає всіfilter() звернення елементів , обов'язково повертає лише неелементи undefined:

> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(function(){return true})
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]

Однак виписувати ...(function(){return true;})довше, ніж писати ...(Object); і повернене значення Objectконструктора буде, за будь-яких обставин , якимсь об’єктом. На відміну від конструкторів примітивного боксу, запропонованих вище, жодна можлива цінність об'єкта не є фальсією, і, таким чином, в булевій обстановці, Objectце короткий хід function(){return true}.

> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(Object)
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]

1
ПОПЕРЕДЖЕННЯ: фільтр (String) і filter (Object) не відфільтровують нуль або цифри. Оскільки конструктор - це також функція, ви можете передавати String фільтрувати, тобто someArray.filter(String);фактично еквівалентний someArray.filter(function(x){ return String(x); });. Якщо ви хочете видалити всі фальшиві значення, someArray.filter(Boolean);працює для видалення 0, -0, NaN, false, '', null та undefined.
robocat

1
Приємна відповідь, хоча мені цікаво ефективність виклику Objectконструктора на відміну від return trueметоду. @robocat ОП попросив видалити порожні елементи, а не нулі.
Альнітак

Я віддаю перевагу найкоротшому і найяскравішому рішенню, за винятком тісних петель. Я вважаю, особисті переваги. (=
ELLIOTTCABLE

3

Під час використання найвищої відповіді, зазначеної вище, у першому прикладі я отримував окремі символи довжиною рядків більше 1. Нижче моє рішення цієї проблеми.

var stringObject = ["", "some string yay", "", "", "Other string yay"];
stringObject = stringObject.filter(function(n){ return n.length > 0});

Замість того, щоб не повертатися, якщо не визначено, ми повертаємось, якщо довжина більше 0. Надіюсь, що хтось там допоможе.

Повертається

["some string yay", "Other string yay"]

+1, оскільки це дуже практично, і саме те, що мені зазвичай потрібно працювати з рядковими масивами, але пам’ятайте, що це видаляє числа (якщо вони не є в рядковій формі), оскільки у них немає .lenghth, замінюючи ["", "some string yay", "", "", 123, "Other string yay"].filter(function(n){ return n.length > 0}) //gives your same result removing 123цю функцію. .. за іронією імені String залишає числа, але дасть такий же результат у вашому заданому масиві.
амарки


2

Що на рахунок того:

js> [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,].filter(String).join(',')
1,2,3,3,0,4,4,5,6

6
join() === join(','):)
pimvdb

1

Це працює, я перевірив його в 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
Це, здається, працює лише «випадково», оскільки саме акт перерахування ключів через for ... inце насправді викликає пропуск відсутніх елементів. Тест undefinedслужить лише для видалення реальних елементів, явно встановлених на це значення.
Альнітак

1

Інший спосіб зробити це - скористатися властивістю довжини масиву: запакуйте ненульові елементи на "ліворуч" масиву, а потім зменшіть довжину. Це місцевий алгоритм - він не виділяє пам'ять, занадто поганий для сміттєзбірника, і він має дуже гарну найкращу / середню / гіршу поведінку.

Це рішення, порівняно з іншими тут, у 2–50 разів швидше на Chrome і в 5–50 разів швидше на Firefox, як ви могли бачити тут: http://jsperf.com/remove-null-items-from-array

Код нижче додає до масиву нечисленний метод 'deleteNull', який повертає 'це' для ланцюжка ромашок:

var removeNull = function() {
    var nullCount = 0           ;
    var length    = this.length ;
    for (var i=0, len=this.length; i<len; i++) { if (!this[i]) {nullCount++} }
    // no item is null
    if (!nullCount) { return this}
    // all items are null
    if (nullCount == length) { this.length = 0; return this }
    // mix of null // non-null
    var idest=0, isrc=length-1;
    length -= nullCount ;                
    while (true) {
         // find a non null (source) slot on the right
         while (!this[isrc])  { isrc--; nullCount--; } 
         if    (!nullCount) { break }       // break if found all null
         // find one null slot on the left (destination)
         while ( this[idest]) { idest++  }  
         // perform copy
         this[idest]=this[isrc];
         if (!(--nullCount)) {break}
         idest++;  isrc --; 
    }
    this.length=length; 
    return this;
};  

Object.defineProperty(Array.prototype, 'removeNull', 
                { value : removeNull, writable : true, configurable : true } ) ;

Приємна відповідь, хоча було б добре побачити кілька тестових випадків, щоб показати це в дії!
Альнітак

2
Ця відповідь дуже захоплююча, але свого роду нагадує мені подивитися на комп'ютер, побудований у 1945 році, коли у мене є смартфон : arr.filter(e => e).
agm1984

1
foo = [0, 1, 2, "", , false, 3, "four", null]

foo.filter(function(e) {
    return e === 0 ? '0' : e
})

повертає

[0, 1, 2, 3, "four"]

1

"Неправильне використання" циклу for ... in (object-member). => У тілі циклу відображаються лише значення truthy.

// --- Example ----------
var field = [];

field[0] = 'One';
field[1] = 1;
field[3] = true;
field[5] = 43.68;
field[7] = 'theLastElement';
// --- Example ----------

var originalLength;

// Store the length of the array.
originalLength = field.length;

for (var i in field) {
  // Attach the truthy values upon the end of the array. 
  field.push(field[i]);
}

// Delete the original range within the array so that
// only the new elements are preserved.
field.splice(0, originalLength);

код правильний, коментар невірний. Акт використання for ... in- це те, що вилучає невизначені ключі з масиву, але ви насправді тут не маєте коду, щоб інакше прийняти лише "truthy" значення
Alnitak

1

Це може допомогти вам: https://lodash.com/docs/4.17.4#remove

var details = [
            {
                reference: 'ref-1',
                description: 'desc-1',
                price: 1
            }, {
                reference: '',
                description: '',
                price: ''
            }, {
                reference: 'ref-2',
                description: 'desc-2',
                price: 200
            }, {
                reference: 'ref-3',
                description: 'desc-3',
                price: 3
            }, {
                reference: '',
                description: '',
                price: ''
            }
        ];

        scope.removeEmptyDetails(details);
        expect(details.length).toEqual(3);

scope.removeEmptyDetails = function(details){
            _.remove(details, function(detail){
                return (_.isEmpty(detail.reference) && _.isEmpty(detail.description) && _.isEmpty(detail.price));
            });
        };

1
var data= { 
    myAction: function(array){
        return array.filter(function(el){
           return (el !== (undefined || null || ''));
        }).join(" ");
    }
}; 
var string = data.myAction(["I", "am","", "working", "", "on","", "nodejs", "" ]);
console.log(string);

Вихід:

Я працюю над nodejs

Він видалить порожній елемент з масиву та відобразить інший елемент.


вихід: 'Я працюю над nodejs'. він видалить порожній елемент з масиву та відобразить інший елемент.
Jitendra virani

Я покращив вашу відповідь. Будь-ласка, спробуйте зробити просту, зрозумілу та зрозумілу відповідь;)
ГГО

1

Видалення всіх порожніх елементів

Якщо масив містить порожні об'єкти, масиви та рядки поряд з іншими порожніми елементами, ми можемо їх видалити за допомогою:

const arr = [ [], ['not', 'empty'], {}, { key: 'value' }, 0, 1, null, 2, "", "here", " ", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ]

let filtered = JSON.stringify(
  arr.filter((obj) => {
    return ![null, undefined, ''].includes(obj)
  }).filter((el) => {
    return typeof el != "object" || Object.keys(el).length > 0
  })
)

console.log(JSON.parse(filtered))

Просте ущільнення (видалення порожніх елементів з масиву)

З ES6:

const arr = [0, 1, null, 2, "", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ,]

let filtered = arr.filter((obj) => { return ![null, undefined].includes(obj) })

console.log(filtered)

З простим Javascript ->

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

var filtered = arr.filter(function (obj) { return ![null, undefined].includes(obj) })

console.log(filtered)


0

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

array = array.filter(/\w/);
filter + regexp

Це працює? він показує помилку TypeError: [об'єкт RegExp] не є функцією
FreeLightman

0

Найкращий спосіб видалення порожніх елементів - це використання Array.prototype.filter(), як уже говорилося в інших відповідях.

На жаль, Array.prototype.filter()IE <9 не підтримується. Якщо вам все-таки потрібно підтримувати IE8 або навіть більш стару версію IE, ви можете скористатись такою полізаправкою, щоб додати підтримку Array.prototype.filter()в цих браузерах:

if (!Array.prototype.filter) {
  Array.prototype.filter = function(fun/*, thisArg*/) {
    'use strict';
    if (this === void 0 || this === null) {
      throw new TypeError();
    }
    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== 'function') {
      throw new TypeError();
    }
    var res = [];
    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
    for (var i = 0; i < len; i++) {
      if (i in t) {
        var val = t[i];
        if (fun.call(thisArg, val, i, t)) {
          res.push(val);
        }
      }
    }
    return res;
  };
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.