2015-07-05 2 views
1

Простая функция для очистки массива, если он имеет нулевые или пустые значения, так что если мы имеем:Javascript массив чистой функции

[ 'click1', 'click2', null, '', '', 'submitForm' ] 

... он вернется:

[ 'click1', 'click2', 'submitForm' ] 

Вот мой код:

function squeakyClean(arr) { 
    for (var i = 0; i < arr.length; i++) { 
    if (arr[i] == null || arr[i] == '') { 
     arr.splice(i); 
    }; 
    }; 
    return arr; 
} 

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

Он работает, если вы вводите массив без пустых строк или нулевых значений, но если я вхожу в [ 1, , 2, 3, 0, -1, 1.1 ], он возвращает [1], которого он не должен делать. Что мне здесь не хватает?

PS: Я посмотрел, как другие люди решили это использовать без использования метода loop и splice, но меня интересует, как его решить, используя эти два.

+0

Может быть, это просто опечатка, но: Если ввести массив, как [не 1,, 3, 4] значение с индексом 1 массива (второе значение) будет ни null или пустая строка, но не определена. Если вы этого не хотите, вам нужно отфильтровать его (typeof arr [i] === 'undefined'). – RhinoDevel

+0

Это правда, я об этом не думал. Но как только я изменил arr.splice (i) на arr.splice (i, 1), он полностью работает. Hmm – AntK

ответ

1

Ваш код не зависит от использования метода .splice, где вы также должны указать количество элементов для этого индекса для удаления.

Пример: Array.splice (index, numberOfItemsFromIndex);

Поэтому, чтобы исправить свой код он должен быть простым, как:

function squeakyClean(arr) { 
    for (var i = 0; i < arr.length; i++) { 
    if (arr[i] == null || arr[i] == '') { 
     arr.splice(i, 1); 
    }; 
    }; 
    return arr; 
} 

(Splice Documentation)

1

Рассмотрите возможность использования filter. Например, следующий будет отфильтровывать null, undefined, false, +0, -0, NaN и "":

arr.filter(Boolean) 
+0

Как я уже говорил, я видел, как другие люди решили это, и я понял, что есть другие более эффективные способы сделать это, но меня заинтересовало то, что было не так с моим. Спасибо в любом случае – AntK

0

Ваш код имеет две проблемы:

  • Вы должны пройти 2-й аргумент splice в чтобы рассказать, сколько предметов вы хотите удалить
  • Удаления с splice reindex массив. Это означает, что вы пропустите элемент при удалении предыдущего. Вы можете решить это, итерации назад.
function squeakyClean(arr) { 
    for (var i = arr.length-1; i >= 0 ; --i) 
    if (arr[i] == null || arr[i] == '') 
     arr.splice(i, 1); 
    return arr; 
} 
+0

Я понял это позже и решил его, добавив i-- внутри оператора if после метода сплайсинга, но мне больше нравится ваш вариант – AntK

1

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

function swipeArray(arr) { 
 
    var newArr = new Array(); 
 
    for (var i = 0; i < arr.length; i++) { 
 
    if (arr[i]||arr[i]===0||arr[i]===false) 
 
     newArr.push(arr[i]); 
 
    } 
 
    return newArr; 
 
} 
 

 
var arr = new Array('click1', 'click2', null, '', '', 'submitForm',0,false); 
 

 
document.getElementById("out").textContent = JSON.stringify(swipeArray(arr))
<p id="out"></p>

Edit: если вы расширяете условие if, вы можете избежать очистки 0, false или других значений в массиве.

0

alert(
 
    [ 'click1', 'click2', null, '', '', 'submitForm' ].filter(function(x){ 
 
    return !!x; // or simple `return x;` 
 
    }) 
 
)