JavaScriptで配列から空の要素を削除するには?
簡単な方法があるのでしょうか、それとも配列をループさせて手動で削除する必要があるのでしょうか?
EDIT: この質問は、約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);
何をもって"empty"とするかにもよりますが、例えば文字列を扱うのであれば、上記の関数は空の文字列である要素を削除しません。
よく見かける典型的なパターンとしては、空文字列 ""
, 0
, NaN
, null
, undefined
, false
などの falsy な要素を削除することです。
例えば、filter
メソッドやBoolean
コンストラクタ関数に渡したり、フィルタ基準関数で同じ要素を返したりすることができます。
var filtered = array.filter(Boolean);
または
var filtered = array.filter(function(el) { return el; });
どちらの場合も、最初のケースでは filter
メソッドが Boolean
コンストラクタを関数として呼び出して値を変換し、2番目のケースでは filter
メソッドが内部的にコールバックの戻り値を暗黙のうちに Boolean
にしているので、これは機能します。
疎な配列を扱っていて、"hole"を取り除こうとしている場合は、例えば、真を返すコールバックを渡すfilter
メソッドを使うことができます。
var sparseArray = [0, , , 1, , , , , 2, , , , 3],
cleanArray = sparseArray.filter(function () { return true });
console.log(cleanArray); // [ 0, 1, 2, 3 ]
古い答え: Don't do this!
私はこの方法で、ネイティブのArrayプロトタイプを拡張して使っています。
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,,,,]);
これまで提案されてきたようなループ&スプライスを試すよりも、配列をループさせて、配列から残しておきたいアイテムを集めて新しい配列を作る方が簡単だと思うかもしれません。
次のような方法があります。
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]
アイデアがあれば、他のタイプのフィルタ関数を作ることができます。おそらく必要以上に多いと思いますが、私は寛大な気持ちでいました... ;)