これは、「インデックス」の位置にある値が存在するかどうかをテストするために機能しますか、それともより良い方法がありますか?
if(arrayName[index]==""){
// do stuff
}
これは、「インデックス」の位置にある値が存在するかどうかをテストするために機能しますか、それともより良い方法がありますか?
if(arrayName[index]==""){
// do stuff
}
回答:
概念的には、JavaScriptの配列にはからまでのarray.length
要素が含まれます。インデックス付きの配列要素は、との間にある場合、配列の一部として定義されます。iがこの範囲にない場合、配列にはありません。array[0]
array[array.length - 1]
i
i
0
array.length - 1
つまり、概念的には、配列は線形であり、ゼロから始まり、最大値に達します。エントリが存在しないその範囲内に「ギャップ」を持つメカニズムはありません。特定の位置インデックス(indexは0または正の整数)に値が存在するかどうかを調べるには、文字通り単に
if (i >= 0 && i < array.length) {
// it is in array
}
動的言語ではあまり意味がなく、特定のコードでは非効率的であるため、現在、内部ではJavaScriptエンジンは配列スペースをこのように直線的かつ連続的に割り当てません。それらはおそらくハッシュテーブルまたは戦略のハイブリッド混合であり、配列の未定義の範囲にはおそらく独自のメモリが割り当てられていません。それにもかかわらず、JavaScriptは言語は現在の配列に望んでいるarray.length
n個持つものとしてのnメンバーと彼らの名前は0にN - 1、およびこの範囲内のものがアレイの一部です。
ただし、おそらく必要なのは、配列内の値が実際に定義されたものであるかどうかを知ることですundefined
。つまり、そうではありません。たぶん、あなたも、それが定義されていますかどうかを知りたいではありませんnull
。値を設定せずにメンバーを配列に追加することは可能です。たとえば、array.length
プロパティを増やして配列値を追加すると、新しい値はすべてになりますundefined
。
指定された値が意味のあるものであるか、定義されているかを判断するため。つまり、ではない undefined
、またはnull
:
if (typeof array[index] !== 'undefined') {
または
if (typeof array[index] !== 'undefined' && array[index] !== null) {
興味深いことに、JavaScriptの比較ルールにより、最後の例は次のように最適化できます。
if (array[index] != null) {
// The == and != operators consider null equal to only null or undefined
}
length
プロパティも含まれます。この場合、後の2つの例の方が適切です。
foo !== 'undefined' && foo !== null
だけでfoo != null
0
までのすべての要素で構成されると言われていますarray.length - 1
。ただし、これらの値のすべてが定義済みの値であるとは限りません。配列メンバーでdeleteキーワードを使用すると、そのメンバーは未定義に設定されます。array.lengthパラメーターを増分して配列を拡張する場合と同様に、新しい値は未定義として開始されます。実際には、JavaScript実装はおそらく配列のストレージを最適化し、未定義の値の一部またはすべてがメモリを占有しない場合があります。
new Array(1)[0] === undefined
しかし、値は空です。 [undefined][0] === undefined
しかし、値は設定されています。配列には値があります。唯一の完璧な答えは、使用しているin
かhasOwnProperty()
- idx in array
あるいはarray.hasOwnProperty(idx)
この答え--per:stackoverflow.com/a/39171620/3120446
これを行うことはできませんか?
if(arrayName.length > 0){
//or **if(arrayName.length)**
//this array is not empty
}else{
//this array is empty
}
if(arrayName.length) {...
違いを作りますか?
if(arrayName.length) {...
失敗したnull
[undefined, undefined]
長さ= 2を持つ配列である
のみを使用するの.length
は安全ではなく、一部のブラウザではエラーが発生します。これはより良い解決策です:
if(array && array.length){
// not empty
} else {
// empty
}
または、以下を使用できます。
Object.keys(__array__).length
if(!arrayName[index]){
// do stuff
}
if(arrayName.length > index && arrayName[index] !== null) {
//arrayName[index] has a value
}
x == null
nullまたは未定義の場合にのみ真になります。同様に、x != null
nullでも未定義でもないものすべてに当てはまります。特に未定義のものを探す必要がない限り、暗黙の変換の良さに頼ってください。
短く普遍的なアプローチ
偽の値(false、未定義、null、空の文字列など)がある配列をチェックする場合は、次のように使用できます。 every()メソッドを。
array.every(function(element) {return !!element;}); // returns true or false
例えば:
['23', null, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false
['23', '', 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false
['23', true, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns true
偽の値の最初のインデックスを取得する必要がある場合は、次のように実行できます。
let falsyIndex;
if(!['23', true, 2, null, {key: 'value'}].every(function(element, index) {falsyIndex = index; return !!element;})) {
console.log(falsyIndex);
} // logs 3
特定のインデックスについて配列の偽の値を確認する必要があるだけの場合は、次のように実行できます。
if (!!array[index]) {
// array[index] is a correct value
}
else {
// array[index] is a falsy value
}
if(typeof arr ==='object' && arr instanceof Array ){
if(!arr.length){
println 'empty'
}else{
printn 'not Empty'
}
}else{
println 'Null'
}
「Null」を意味する場合->その要素はnullまたは ''に等しい場合、この場合:すべての「null」要素をフィルタリングした後、配列が空かどうかを確認します
if(!arr.clean().length){return 'is null'}
もちろん、 前にCleanメソッドを追加します。
Array.prototype.clean=function(){return this.filter(function(e){return (typeof e !=='undefined')&&(e!= null)&&(e!='')})}
次のような関数を作成することをお勧めします。
function isEmptyEl(array, i) {
return !(array[i]);
}
次のように呼び出すことができます。
if (isEmptyEl(arrayName, indexVal)) {
console.log('arrayName[' + indexVal + '] is empty');
}
開発者にisEmptyElインターフェースを順守させると、未定義のarrayNameやindexVal変数などの入力エラーをキャッチできます。
(JavaScriptでプログラミングする場合は、防御的にプログラミングするのが一般的には良い習慣です。)
arrayNameが定義されていないと、次のようなエラーがスローされます。
Uncaught ReferenceError: arrayName is not defined
at <anonymous>:2:15
at Object.InjectedScript._evaluateOn (<anonymous>:895:140)
at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34)
at Object.InjectedScript.evaluate (<anonymous>:694:21)
未定義のindexValの同様の結果。
配列またはインデックスの値が存在しない場合、エラーが発生します。
有効な入力の場合、arrayName [indexVal]が次のいずれかである場合にのみtrueを取得します。
それはあなたが「空」で何を意味するかによる。
その名前のプロパティがないオブジェクトのプロパティの値を取得しようとすると、値が取得されます undefined
。
これがスパース配列で起こります。すべてのインデックスがその間0
にarray.length-1
存在するわけではありません。
だからあなたはどうかを確認することができますarray[index] === undefined
。
ただし、プロパティindex
はundefined
値とともに存在する可能性があります。あなたがこのケースをフィルタリングしたい場合は、使用することができin
、オペレータのかhasOwnProperty
で説明したように、オブジェクトはJavaScriptでプロパティを持っている場合、私がチェックする方法は?
index in array;
array.hasOwnProperty(index);
undefined
or null
値を持つ既存のプロパティが存在しないと見なしたい場合は、緩やかな比較array[index] == undefined
またはを使用できますarray[index] == null
。
あなたは、配列がスパースでないことを知っている場合は、比較可能性index
とarray.length
。ただし、安全のために、index
本当に配列インデックスであることを確認したい場合があります。プロパティ名が配列インデックスかどうかを確認するをご覧ください。
OK、我々は以下のような配列を持っているのであれば、のは、最初の配列の値をJavaScriptで存在していない場合でしょうが、何が起こるか見てみましょう:
const arr = [1, 2, 3, 4, 5];
次に、インデックス5に6があるかどうかを確認します。
arr[5];
そして私たちは
undefined
...
つまり、基本的にはそれが答え、未定義かどうかを確認する最良の方法なので、次のようになります。
if("undefined" === typeof arrayName[index]) {
//array value is not there...
}
この場合は、これを行わない方がよいでしょう。
if(!arrayName[index]) {
//Don't check like this..
}
この配列があると想像してください。
const arr = [0, 1, 2];
そして私たちはします:
if(!arr[0]) {
//This get passed, because in JavaScript 0 is falsy
}
ご覧のとおり、0があっても認識されません。同じことを実行してアプリケーションをバグのあるものにすることができる他のものがいくつかあるので、注意してください。
undefined
''
いくつか見落としているように思われる点を指摘したいと思います。つまり、配列の中央に「空の」配列位置がある可能性があります。以下を検討してください。
let arr = [0, 1, 2, 3, 4, 5]
delete arr[3]
console.log(arr) // [0, 1, 2, empty, 4, 5]
console.log(arr[3]) // undefined
チェックする自然な方法は、配列メンバーが未定義かどうかを確認することです。他の方法が存在するかどうかはわかりません
if (arr[index] === undefined) {
// member does not exist
}
Lodashを使用すると、次のことができます。
if(_.has(req,'documents')){
if (req.documents.length)
_.forEach(req.documents, function(document){
records.push(document);
});
} else {
}
if(_.has(req,'documents'))
リクエストオブジェクトにという名前のプロパティがあるかどうかを確認し、そのプロパティがあるdocuments
場合は、次にif (req.documents.length)
それが空の配列でないかどうかを検証して、他の処理をforEach
続行できます。
定義されていないか、削除されているかを確認するには:
if(typeof arrayName[index]==="undefined"){
//the index is not in the array
}
連想配列や、インデックスを削除した配列でも機能します
定義されていないか、削除されたか、またはnullまたは論理的な空の値(NaN、空の文字列、false)であるかどうかを確認するには:
if(typeof arrayName[index]==="undefined"||arrayName[index]){
//the index is not defined or the value an empty value
}
私はlaravelデータテーブルを使用してこの問題に遭遇しました。呼び出さproperties
れたJSON値をアクティビティログに格納していて、この値が空かどうかに基づいてボタンを表示したいと考えていました。
まあ、それが空の場合、データテーブルはこれを配列として解釈し、そうでない場合はオブジェクトとして解釈していたため、次の解決策が私にとってうまくいきました:
render: function (data, type, full) {
if (full.properties.length !== 0) {
// do stuff
}
}
オブジェクトには長さのプロパティがありません。
この決定は、命令型OOPや手続き型よりも宣言型関数型プログラミングを好む人に適していると思います。「内部に値がありますか?(真または偽の値)」という質問の場合、.some
メソッドを使用して内部の値を検証できます。
[].some(el => el || !el);
function isEmpty(arr) { ... }
。[].length
結果として得をし0
ているいくつかのケースでは危険です。[].length > 0
格言は、「ゼロよりその長さの大きいですか?」高度な例:
[ ].some(el => el || !el); // false
[null].some(el => el || !el); // true
[1, 3].some(el => el || !el); // true
Loadshライブラリを使用すると、次のようにこれをより効率的に行うことができます。
たとえば、「pets」という名前の配列がある場合:
var pets = ['dog', undefined, 'cat', null];
console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false
_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });
すべての配列値でnullまたは未定義の値をチェックするには、
var pets = ['dog', undefined, 'cat', null];
console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false
_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
http://underscorejs.org/で他の例を確認してください
fn(){}
は構文エラーであり、これが特定のインデックスに配列項目が存在するかどうかを確認するのにどのように役立つかは、はっきりしていません。