2017-11-29 20 views
0

を探すための適切な方法は何であるI次のコードを持っている: は、未定義の値

if (array.indexOf("undefined")===-1){ 
    do something... 
    } 

私の最初の配列

はこれです:

配列を= [,,,,,,]。

プログラムが進行するにつれて値が塗りつぶされますが、未定義のスペースがない場合は機能を停止します。上記の構文は正しくないが、誰でも私にその理由を教えることができます。

+0

は、より多くの情報が必要。満たされるスペースの最終的な数を知っていますか?それらは順不同で満たされていますか?メンバーによって定義されたスペースが実際の値が「未定義」であるか、単に配列の穴ですか? –

+0

このテストでは、** string ** '' undefined ''が検索されます。 – Pointy

+2

'array.findIndex(function(x){return x === undefined})'はうまくいくようです。 – Blorgbeard

答えて

2

あなたのコードは、文字列 "undefined"を探します。 undefinedの値を含む最初のインデックスを探したいとします。最良の方法は、findIndexを使用することです:あなたは、文字列"undefined"代わりに、値そのものを渡すため

if(array.findIndex(x=>x===undefined) !== -1) { 
    //do something 
} 
+0

これは、私がまだ矢印関数に慣れていないのに、問題を解決しました。ですから、基本的にindexOfで未定義の値を探す方法はありませんか? (実際には== - 1) – Kostis

+1

矢印関数を 'function(x){return x === undefined;}'に置き換えることができます。 'indexOf'で' undefined'を検索する方法はありません。 –

+1

'.indexOf'で' undefined'を確実に検索できます。 '.indexOf'はそれらを無視するため、疎な配列に穴を見つけることはできません。 –

0
for(var ind in array) { 
if(array[ind] === undefined) { 
    doSomething(); 
} 
} 
0

あなたのチェックは動作しませんでした。また、.indexOf()は、配列の穴を明示的に無視するように設計されています。

繰り返しを使用して配列の穴を検出するのは無駄です。代わりに、カウンターを使用して穴の数を追跡し、カウンターが長さに一致するとコードを実行できます。

どちらの方法でも、特定のインデックスの穴を検出する適切な方法は、in演算子を使用することです。

ここでは再利用のためのクラスベースのソリューションです:

class SpacesArray extends Array { 
 
    constructor(n, callback) { 
 
    super(n); 
 
    this.callback = callback; 
 
    this.counter = 0; 
 
    } 
 
    
 
    fillHole(n, val) { 
 
    if (!(n in this)) { 
 
     this.counter++; 
 
     console.log("filling hole", n); 
 
    } 
 
    this[n] = val; 
 
    
 
    if (this.counter === this.length) { 
 
     this.callback(); 
 
    } 
 
    } 
 
} 
 

 
// Usage 
 
var sa = new SpacesArray(10, function() { 
 
    console.log("DONE! " + this); 
 
}); 
 

 
// Emulate delayed, random filling of each hole. 
 
for (let i = 0; i < sa.length; i++) { 
 
    const ms = Math.floor(Math.random() * 5000); 
 
    setTimeout(() => sa.fillHole(i, i), ms); 
 
}