2016-11-22 11 views
11

私はユーザースクリプトの開発者であり、私はページ上のjavascriptを制御できないとします。このページはランダムな長さの配列を作成し、ランダムな値(例えば、undefinedなどの偽のものを含む)でそれらを埋めます。すべての要素に値を割り当てる必要はないため、空のスロットが存在する可能性があります。未定義の配列要素と空のスロットの区別方法は?

簡略化した例(Firefoxのコンソール):JavaScriptのために、彼らは同じように見えるのに対し

var arr = new Array(3); 
arr[0] = null; 
arr[1] = undefined; 
console.log(arr);    \\ Array [ null, undefined, <1 empty slot> ] 
console.log(arr[1]);   \\ undefined 
console.log(arr[2]);   \\ undefined 
console.log(arr[1] === arr[2]); \\ true 
console.log(typeof arr[1]);  \\ undefined 
console.log(typeof arr[2]);  \\ undefined 

我々が見ることができるように、Firefoxは、異なるundefinedと空のスロットを表示します。

ここで、空のスロットをすべて削除し、undefinedの要素はそのままの状態で、このような配列を消去したいとします。それ、どうやったら出来るの?

+1

?あなたは新しい配列が欲しいですか? –

答えて

15

in演算子を使用して、配列にキーがあるかどうかを確認できます。これは、値undefined含めて、値を持つスロット用の空のスロットにfalseを返しますが、本当でしょう:あなたはそれを使用して、配列の末尾を越えて空のスロットとスロットを区別し、そうでない場合でき

var arr = new Array(3); 
arr[0] = null; 
arr[1] = undefined; 

1 in arr; // true 
2 in arr; // false 

注意を配列の長さを知っていれば、3はその一部ではないことをすでに知っているので、3 in arrをテストする必要はありません。

また、このような空のスロットをフィルタリングすることができます

arr = arr.filter(function (_, i) { return i in arr }); 
+1

これは賢いです – Harangue

3

あなたがまばらな要素を省略Array#forEachを、使用することができます。空のスロットを意味するもの

var arr = new Array(3); 
 
arr[0] = null; 
 
arr[1] = undefined; 
 
console.log(arr); 
 

 
var withoutSparse = []; 
 

 
arr.forEach(function (a, i) { 
 
    console.log(i); 
 
    withoutSparse.push(a); 
 
}); 
 
console.log(withoutSparse);
.as-console-wrapper { max-height: 100% !important; top: 0; }

関連する問題