JavaScriptの配列から空の要素を削除する


1145

JavaScriptで配列から空の要素を削除するにはどうすればよいですか?

簡単な方法はありますか、それともループして手動で削除する必要がありますか?


14
ここでの回答のほとんどは「誤った」要素を意味すると誤って(IMHO)解釈するため、質問で「空の要素」が何を意味するかを正確に指定していると役立ちます。注意:あなたが得るものとには違いがvar a = [,,]ありvar a = [undefined, undefined]ます。前者は本当に空ですが、後者は実際には2つのキーを持っていますが、undefined値があります。
Alnitak

回答:


1065

編集:この質問は、ほぼ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空の文字列が含まれ、""0NaNnullundefined、とfalse

filterメソッド、Booleanコンストラクター関数に渡すか、フィルター基準関数で同じ要素を返すことができます。次に例を示します。

var filtered = array.filter(Boolean);

または

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

どちらの方法でも、これfilterは最初のケースのメソッドがBooleanコンストラクターを関数として呼び出して値を変換し、2番目のケースでfilterメソッドが内部的にコールバックの戻り値を暗黙的にに変換するため機能しBooleanます。

スパース配列を使用していて、「穴」を取り除こうとしている場合は、filtertrueを返すコールバックを渡すメソッドを使用できます。次に例を示します。

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

110
警告:2番目のオプションは、「偽」、つまりfalse、0、null、およびundefinedの値と見なされる配列から要素を削除します。この配列のように、値が0の要素が必要な場合でも、[null ,,, 0、、0,0,0、false、null、0]となると、この配列には何も含まれなくなります。[ 1,0,1,0,0,1]
Jason Bunting

5
私はそのことに気づきました-そのため、私は2番目のオプションについてのみ話しました。最初のものはスコープが非常に狭いので、配列のプロトタイプの一部にすることをためらいます。より理想的なものについては、このページのAlnitakの回答を参照してください。もちろん、連鎖は可能です。
Jason Bunting

1
「filter」メソッドにアクセスできない場合、最初のソリューションは本当に素晴らしいです。そうでなければ、アルニタクの答えの方が良いと思います。
ジョー・ピネダ

2
@AlfaTek-JSの配列は実際には配列ではないため、最新のブラウザーを除くすべてにおいて#2が最高のパフォーマンスを発揮します。spliceコールは、本当に彼らはギャップをクローズアップするために配列のキーのすべての番号を変更する必要があるため、古いブラウザに高価。
アルニタク

1
@Davidいいえ、最新のコードでは、新しい関数を列挙不可能なプロパティにするために安全にArray.prototypeを使用Object.definePropertyして拡張し、すべてのループを配置することによるパフォーマンスへの影響を回避する必要があります。.hasOwnProperty
Alnitak 2015年

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は2013年

19
foo.join("").split("")文字列が単一の文字である場合にのみ機能するようです
Atav32

9
純粋なJavaScriptコードにバグがあります。配列に「0」が含まれる値がある場合、「0」は不正であるため、値はフィルターで除外されます。あなたが欲しいのは:arr.filter(function(n){return(n!== undefined && n!== null);});
John Kurlak、2014年

5
ES6はそれをより簡単に行うことができarr.filter(e=>e)、これはマップ、リデュースなどによって連鎖させることができます
Sheepy

242

すべての空の値( ""、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, " "]

うん、これはいいことだ。「」も削除される。
Vladimirs

3
テスト関数はもう少し明確にすることができます:function(e){return !!e}
公園。

4
@Koen !!eは、NaN(0とは異なります)を含みeません(0とは異なります)を含みます。
Sheepy 2015

尋ねられた質問には実際には答えません。
アルニタク2015

2
またはvar myarr=[1, 2,, 3,, 3,undefined,,"",,0, 4,, 4,, 5,, 6,,,,].filter(Boolean);、未定義の削除を使用してください""および0
マークシュルタイス

134

単に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]

1
これは本当にクールです-私は新しい質問があります:関数呼び出しとしてクラス名を使用しているようです-その型キャストですか?これまでに見たことがないので、なぜパスBooleanが関数として機能するのかわかりません...
Andrew

8
Boolean関数として扱う場合は、単に値が返されるtruefalse、値が本当に/偽であるかを判断します。
andlrc 2013

8
ブール値を関数として扱っているわけではありません。それがある機能。(ネイティブに実装されていることを除いて、完全に通常の関数です。)誰かがJavaScriptオブジェクトモデルについて少し調査する必要があります。;)
ELLIOTTCABLE 2015

@ELLIOTTCABLEイムは、ちょうど、ここにこれを残すつもり(true).constructor === Boolean。そして、JSの他のビルドインでこれができるかどうか教えてください。;))(もちろん、他の5つの組み込みコンストラクタを除外しました。(文字列、配列、オブジェクト、関数、数値))
andlrc

1
配列に値0がある場合、両方とも失敗します
Sai Ram

129

JavaScript 1.6以降をおArray.filter持ちの場合は、次のような簡単なreturn trueコールバック関数を使用できます。

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

.filter元の配列で欠落している要素を自動的にスキップするため。

上記のMDNページにfilterは、公式バージョンをサポートしていないJavaScriptインタープリターで使用できるエラーチェックバージョンが含まれています。

これはnullエントリも明示的なundefined値のエントリも削除しませんが、OPは「欠落」エントリを明確に要求したことに注意してください。


あなたが正しい!次のように簡単にできます(そして機能します!):test3 = [1,2、、3、、3 ,,,, 7 ,,, 7 ,,, 0 ,,, 4、、4、、5 ,, 6、、undefined ,, null ,,]; printp( "配列のネイティブフィルタリングの使用:"、test3.filter(function(value){return(value == undefined)?0:1;}));
Joe Pineda

3
+1 Alnitakが言ったように、彼らはjs 1.6が利用できない場合に使用できるコードを持っています
Sameer Alibhai

3
@katsh明確にしました-上記のコード、値がまったく存在しないエントリを削除するために機能します。これは、(後で)存在するキーの場合とは意味的に異なりますがundefined、指定された値を持つキーの場合とは異なります。
アルニタク2014

4
未定義またはnullのエントリを削除するには、小さな変更を加えます... arr = arr.filter(function(v){return v;});
アランCN

4
@AlanCNあなたは私のポイントを完全に逃しました。OPは不足しているエントリを削除するように求めましたが、ここでの回答の大部分は(誤って)「誤った」エントリを削除します。
Alnitak 2016年

65

穴を取り除くには、

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]


3
これは答えの上位にあるはずです。穴/穴..とはどういう意味ですか?
samayo

2
@samayo穴は埋められていない、すなわち配列項目です[, ,]
ジミーObonyo ABOR

arr.filter(x => x)JSはを使用して、xが真か偽かをチェックします。つまりif (x)、真の値のみが新しいリストに割り当てられます。
KuanYu Chu

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 2011年

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の値が含まれている場合、それらも削除されます。
SamuelBrandão2016年

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

@アルニタク

実際に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;
  };
}

これはそのまま使用できるので、受け入れられる答えになるはずです。どうもありがとう。
Tony

@Tonyいいえ、それはすべきではありません。空の文字列を含む要素は「空の要素」と同じではないためです。後者はOPが要求したものです。
アルニタク2015

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):配列から偽の値を削除します。

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

空の要素のない配列を取得するには、filterを使用する必要があります。ES6の例

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

3

私は単純に「ES5のを呼び出すの上に私の声を追加しているArray..filter()ゴルフ・ハックグローバルコンストラクタで」が、私は使用することをお勧めObjectするのではなくStringBooleanまたは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
注意:filter(String)およびfilter(Object)は、nullや数値を除外しません。コンストラクターは関数でもあるため、フィルターに文字列を渡すことができます。つまりsomeArray.filter(String);、実際にはと同等someArray.filter(function(x){ return String(x); });です。すべての偽の値を削除する場合はsomeArray.filter(Boolean);、0、-0、NaN、false、 ''、null、およびundefinedを削除します。
robocat 2013年

1
いい答えですがObjectreturn trueメソッドではなくコンストラクターを呼び出すことによるパフォーマンスのオーバーヘッドについては疑問に思います。@robocat OPは、nullではなく空の要素の削除を要求しました。
アルニタク2015

タイトループを除いて、私は最短で最も明確なソリューションを好みます。個人的な好みだと思います。(=
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を使用すると、数値はそのまま残りますが、指定した配列では同じ結果が得られます。
aamarks



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、その値に明示的に設定されている実際の要素を削除するためだけに役立ちます。
Alnitak

1

これを行う別の方法は、配列の長さプロパティを利用することです。配列の「左」に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 } ) ;

良い答えですが、実際の動作を示すためにいくつかのテストケースを見るのは良いことです。
アルニタク2015

2
この答えは非常に魅力的ですが、スマートフォンを持っているときに、1945年に建てられたコンピューターを見るような気がしますarr.filter(e => e)
agm1984

@ agm1984スマートフォンは、スマートではありません
エルナンEche

それはsmart、動詞などの定義によって、鋭い刺痛を引き起こす場合があります。これは、あなたのコメントのために電話を武器にした場合の肉体的な痛みのために関連しています。
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)ループの「誤用」。=>ループの本体には真の値のみが表示されます。

// --- 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ことにより、未定義のキーが配列から削除されますが、実際には、「真の」値のみを受け入れるコードはありません
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 2018

私はあなたの答えを改善しました。シンプルで明確で読みやすい回答を作成してみてください;)
GGO

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:[object RegExp] is not a function
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;
  };
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.