回答:
編集:この質問は、ほぼ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
コンストラクターを関数として呼び出して値を変換し、2番目のケースでfilter
メソッドが内部的にコールバックの戻り値を暗黙的にに変換するため機能しBoolean
ます。
スパース配列を使用していて、「穴」を取り除こうとしている場合は、filter
trueを返すコールバックを渡すメソッドを使用できます。次に例を示します。
var sparseArray = [0, , , 1, , , , , 2, , , , 3],
cleanArray = sparseArray.filter(function () { return true });
console.log(cleanArray); // [ 0, 1, 2, 3 ]
古い答え:これを行わないでください!
私はこの方法を使用して、ネイティブの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,,,,]);
splice
コールは、本当に彼らはギャップをクローズアップするために配列のキーのすべての番号を変更する必要があるため、古いブラウザに高価。
Array.prototype
を使用Object.defineProperty
して拡張し、すべてのループを配置することによるパフォーマンスへの影響を回避する必要があります。.hasOwnProperty
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]
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]
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, ()=>{}]
arr = arr.filter(function(n){return n; });
foo.join("").split("")
文字列が単一の文字である場合にのみ機能するようです
arr.filter(e=>e)
、これはマップ、リデュースなどによって連鎖させることができます
すべての空の値( ""、null、未定義、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、未定義、および「」)を削除したい場合があります。これは1つの方法です。
arr.filter(function(e){ return e === 0 || e });
返品:
["hello", 0, 1, 100, " "]
function(e){return !!e}
!!e
は、NaN(0とは異なります)を含みe
ません(0とは異なります)を含みます。
var myarr=[1, 2,, 3,, 3,undefined,,"",,0, 4,, 4,, 5,, 6,,,,].filter(Boolean);
、未定義の削除を使用してください""および0
単に1つのライナー:
[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]
Boolean
が関数として機能するのかわかりません...
Boolean
関数として扱う場合は、単に値が返されるtrue
かfalse
、値が本当に/偽であるかを判断します。
(true).constructor === Boolean
。そして、JSの他のビルドインでこれができるかどうか教えてください。;))(もちろん、他の5つの組み込みコンストラクタを除外しました。(文字列、配列、オブジェクト、関数、数値))
JavaScript 1.6以降をおArray.filter
持ちの場合は、次のような簡単なreturn true
コールバック関数を使用できます。
arr = arr.filter(function() { return true; });
.filter
元の配列で欠落している要素を自動的にスキップするため。
上記のMDNページにfilter
は、公式バージョンをサポートしていないJavaScriptインタープリターで使用できるエラーチェックバージョンが含まれています。
これはnull
エントリも明示的なundefined
値のエントリも削除しませんが、OPは「欠落」エントリを明確に要求したことに注意してください。
undefined
、指定された値を持つキーの場合とは異なります。
穴を取り除くには、
arr.filter(() => true)
arr.flat(0) // Currently stage 3, check compatibility before using this
穴、および偽の(null、未定義、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]
[, ,]
arr.filter(x => x)
JSはを使用して、xが真か偽かをチェックします。つまりif (x)
、真の値のみが新しいリストに割り当てられます。
それを行うためのクリーンな方法。
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"]
undefined
です。これは基本的にすべての偽の値を削除します。
アンダースコア/ロダッシュ:
一般的な使用例:
_.without(array, emptyVal, otherEmptyVal);
_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
空の場合:
_.without(['foo', 'bar', '', 'baz', '', '', 'foobar'], '');
--> ["foo", "bar", "baz", "foobar"]
なしのlodashのドキュメントを参照してください。
ライブラリを使用して、私はunderscore.jsが(コンパクトと呼ばれる機能を持って知っているオプション)の場合http://documentcloud.github.com/underscore/それはまた、配列やコレクションに関連するいくつかの他の有用な機能を持っています。
ドキュメントからの抜粋を次に示します。
_.compact(配列)
すべての偽の値が削除された配列のコピーを返します。JavaScriptでは、false、null、0、 ""、undefined、NaNはすべて偽です。
_.compact([0、1、false、2、 ''、3]);
=> [1、2、3]
@アルニタク
実際に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;
};
}
ループの途中で配列の長さを変更するため、提案されているようにループしてスプライスするよりも、配列をループして配列から保持する項目から新しい配列を構築する方が簡単な場合があります。以上は問題を引き起こす可能性があります。
あなたはこのようなことをすることができます:
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]
あなたはアイデアを得ます-あなたは他のタイプのフィルター機能を持つことができます。おそらくあなたが必要とする以上のものですが、私は寛大に感じていました...;)
私は単純に「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]
someArray.filter(String);
、実際にはと同等someArray.filter(function(x){ return String(x); });
です。すべての偽の値を削除する場合はsomeArray.filter(Boolean);
、0、-0、NaN、false、 ''、null、およびundefinedを削除します。
Object
、return true
メソッドではなくコンストラクターを呼び出すことによるパフォーマンスのオーバーヘッドについては疑問に思います。@robocat OPは、nullではなく空の要素の削除を要求しました。
上記の最も高い投票数の回答を使用した場合、最初の例では、文字列の長さが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"]
["", "some string yay", "", "", 123, "Other string yay"].filter(function(n){ return n.length > 0}) //gives your same result removing 123
。その関数を置き換えます。 ..皮肉なことに、Stringを使用すると、数値はそのまま残りますが、指定した配列では同じ結果が得られます。
var data = [null, 1,2,3];
var r = data.filter(function(i){ return i != null; })
console.log(r)
[1、2、3]
そのことについて何:
js> [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,].filter(String).join(',')
1,2,3,3,0,4,4,5,6
join() === join(',')
:)
これは機能します。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]
*/
for ... in
欠けている要素のスキップを実際に引き起こすのは、キーを列挙する行為であるため、これは「偶然」にのみ機能するように見えます。のテストはundefined
、その値に明示的に設定されている実際の要素を削除するためだけに役立ちます。
これを行う別の方法は、配列の長さプロパティを利用することです。配列の「左」にnull以外の項目をパックしてから、長さを減らします。これはインプレースアルゴリズムであり、メモリを割り当てないため、ガベージコレクターには不適切です。また、最良/平均/最悪の場合の動作が非常に優れています。
:あなたがここに表示される場合がありますので、このソリューションは、ここで他の人に比べて、5〜50倍高速のFirefoxに速くクロームの2〜50倍の間であり、http://jsperf.com/remove-null-items-from-array
以下のコードは、列挙不可能な「removeNull」メソッドを配列に追加します。これにより、デイジーチェーン接続に対して「this」が返されます。
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 } ) ;
arr.filter(e => e)
。
smart
、動詞などの定義によって、鋭い刺痛を引き起こす場合があります。これは、あなたのコメントのために電話を武器にした場合の肉体的な痛みのために関連しています。
for ... in(object-member)ループの「誤用」。=>ループの本体には真の値のみが表示されます。
// --- 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
ことにより、未定義のキーが配列から削除されますが、実際には、「真の」値のみを受け入れるコードはありません
これは役立つかもしれません: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));
});
};
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に取り組んでいます
空の要素を配列から削除し、他の要素を表示します。
配列に空のオブジェクト、配列、文字列が他の空の要素と一緒に含まれている場合は、次のようにして削除できます。
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)
正規表現を使用して無効なエントリを除外する
array = array.filter(/\w/);
filter + regexp
空の要素を削除する最善の方法は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;
};
}
var a = [,,]
ありvar a = [undefined, undefined]
ます。前者は本当に空ですが、後者は実際には2つのキーを持っていますが、undefined
値があります。