次の配列がある場合:
var arr = [undefined, undefined, 2, 5, undefined, undefined];
are定義された要素の数を取得したい(つまり:notundefined
)。配列をループする以外に、これを行う良い方法はありますか?
最近のブラウザでは、 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);
使用できる方法はいくつかありますが、最後に、ループの代わりにこれらを実行する価値があるかどうかを確認する必要があります。
配列length
は配列内の要素の数ではなく、最高のindex + 1
。 length
プロパティは、連続するインデックスに有効な要素がある場合にのみ、正しい要素数を報告します。
var a = [];
a[23] = 'foo';
a.length; // 24
そうは言っても、ループの形式を使用せずに未定義の要素をcountから除外する方法はありません。
いいえ、未定義でない要素の数を知る唯一の方法は、それらをループしてカウントすることです。それはyouがループを書かなければならないという意味ではありませんが、ただ何か、どこかでそれをしなければなりません。 (その警告を追加した理由については、以下の#3を参照してください。)
どのようにループしてカウントするかはあなた次第です。多くの方法があります。
0
からarr.length - 1
への標準のfor
ループ(包括的)。for..in
ループ 正しい保護手段を講じている場合 。some
、 filter
、または reduce
。適切な関数を渡します。これは、ループを明示的に記述する必要がないだけでなく、これらの機能を使用すると、JavaScriptエンジンがループを内部でさまざまな方法で最適化できるため便利です。 (実際にdoesかどうかはエンジンによって異なります。)...ただし、明示的にまたは(新しい配列機能の場合)暗黙的にループになります。
未定義のものが暗黙的である場合、次のことができます。
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
残念ながら、いいえ。ループを通過してカウントする必要があります。
編集:
var arrLength = arr.filter(Number); alert(arrLength);
値を削除してからチェックします(必要に応じてここでnullチェックを削除します)
const x = A.filter(item => item !== undefined || item !== null).length
Lodashを使用
const x = _.size(_.filter(A, item => !_.isNil(item)))
すべてのブラウザーでループしてカウントする:
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; }
})