web-dev-qa-db-ja.com

「定義済み」配列要素の数

次の配列がある場合:

var arr = [undefined, undefined, 2, 5, undefined, undefined];

are定義された要素の数を取得したい(つまり:notundefined)。配列をループする以外に、これを行う良い方法はありますか?

32
Erik

最近のブラウザでは、 filter を使用できます

var size = arr.filter(function(value) { return value !== undefined }).length;

console.log(size);

ブラウザが配列に対して indexOf をサポートする場合の別の方法:

var size = arr.slice(0).sort().indexOf(undefined);

不合理な場合、配列に1桁のみの要素がある場合、その汚いトリックを使用できます。

console.log(arr.join("").length);

使用できる方法はいくつかありますが、最後に、ループの代わりにこれらを実行する価値があるかどうかを確認する必要があります。

57
ZER0

配列lengthは配列内の要素の数ではなく、最高のindex + 1lengthプロパティは、連続するインデックスに有効な要素がある場合にのみ、正しい要素数を報告します。

var a = [];
a[23] = 'foo';
a.length;  // 24

そうは言っても、ループの形式を使用せずに未定義の要素をcountから除外する方法はありません。

10
taskinoor

いいえ、未定義でない要素の数を知る唯一の方法は、それらをループしてカウントすることです。それはyouがループを書かなければならないという意味ではありませんが、ただ何か、どこかでそれをしなければなりません。 (その警告を追加した理由については、以下の#3を参照してください。)

どのようにループしてカウントするかはあなた次第です。多くの方法があります。

  1. 0からarr.length - 1への標準のforループ(包括的)。
  2. for..inループ 正しい保護手段を講じている場合
  3. somefilter 、または reduce 。適切な関数を渡します。これは、ループを明示的に記述する必要がないだけでなく、これらの機能を使用すると、JavaScriptエンジンがループを内部でさまざまな方法で最適化できるため便利です。 (実際にdoesかどうかはエンジンによって異なります。)

...ただし、明示的にまたは(新しい配列機能の場合)暗黙的にループになります。

2
T.J. Crowder

未定義のものが暗黙的である場合、次のことができます。

var len = 0;
for (var i in arr) { len++ };

未定義のものは、明示的に設定しないと暗黙的です

//both are a[0] and a[3] are explicit undefined
var arr = [undefined, 1, 2, undefined];

arr[6] = 3;
//now arr[4] and arr[5] are implicit undefined

delete arr[1]
//now arr[1] is implicit undefined

arr[2] = undefined
//now arr[2] is explicit undefined
0
Jonathan.

残念ながら、いいえ。ループを通過してカウントする必要があります。

編集:

var arrLength = arr.filter(Number);
alert(arrLength);
0
blackpla9ue

値を削除してからチェックします(必要に応じてここでnullチェックを削除します)

const x = A.filter(item => item !== undefined || item !== null).length

Lodashを使用

const x = _.size(_.filter(A, item => !_.isNil(item)))
0
Luke Robertson

すべてのブラウザーでループしてカウントする:

var cnt = 0;
for (var i = 0; i < arr.length; i++) {
    if (arr[i] !== undefined) {
        ++cnt;
    }
}

最新のブラウザ:

var cnt = 0;
arr.foreach(function(val) {
    if (val !== undefined) { ++cnt; }
})
0
jfriend00