Bu, "index" konumundaki bir değerin var olup olmadığını test etmek için mi işe yarar?
if(arrayName[index]==""){
// do stuff
}
Bu, "index" konumundaki bir değerin var olup olmadığını test etmek için mi işe yarar?
if(arrayName[index]==""){
// do stuff
}
Yanıtlar:
Kavramsal olarak, JavaScript'teki diziler şu ana kadar array.length
olan öğeler içerir . Dizin içeren bir dizi öğesi , arasında ve dahil ise dizinin bir parçası olarak tanımlanır . Eğer i bu aralıkta değilse dizide değildir.array[0]
array[array.length - 1]
i
i
0
array.length - 1
Yani kavram gereği, diziler sıfırdan başlayarak ve maksimuma çıkacak şekilde doğrusaldır ve herhangi bir girdinin bulunmadığı bu aralıkta "boşluklar" oluşmasına yönelik herhangi bir mekanizma yoktur. Belirli bir konum dizininde bir değerin olup olmadığını öğrenmek için (burada dizin 0 veya pozitif bir tamsayıdır), kelimenin tam anlamıyla
if (i >= 0 && i < array.length) {
// it is in array
}
Şimdi, kaputun altında, JavaScript motorları neredeyse kesinlikle dizi alanını doğrusal ve bitişik olarak ayırmayacaktır, çünkü dinamik bir dilde pek mantıklı olmaz ve belirli kodlar için verimsiz olur. Muhtemelen karma tablolar veya bazı karma stratejilerdir ve dizinin tanımlanmamış aralıkları muhtemelen kendi belleklerine ayrılmamıştır. Bununla birlikte, dilin array.length
n dizilerini n üyesi olarak göstermek istediği JavaScript, 0 ile n - 1 olarak adlandırılır ve bu aralıktaki her şey dizinin bir parçasıdır.
Bununla birlikte, muhtemelen istediğiniz şey , bir dizideki bir değerin gerçekten tanımlanmış bir şey olup olmadığını bilmektir - yani değil undefined
. Belki de tanımlı olup olmadığınınull
bilmek istersiniz . Değerlerini hiç ayarlamadan bir diziye üye eklemek mümkündür: örneğin, array.length
özelliği artırarak dizi değerleri eklerseniz yeni değerler olur undefined
.
Belirli bir değerin anlamlı mı yoksa tanımlanmış mı olduğunu belirlemek. Bu, değil undefined
veya null
:
if (typeof array[index] !== 'undefined') {
veya
if (typeof array[index] !== 'undefined' && array[index] !== null) {
İlginçtir, JavaScript'in karşılaştırma kuralları nedeniyle, son örneğim buna göre optimize edilebilir:
if (array[index] != null) {
// The == and != operators consider null equal to only null or undefined
}
length
özellik içerir , bu durumda sonraki iki örnek daha uygundur.
foo !== 'undefined' && foo !== null
sadece değiştirebilirsinizfoo != null
0
için array.length - 1
. Yine de bu değerlerin hepsi tanımlanmış değerler olmayacaktır . Eğer bir dizi üyesinde delete anahtar sözcüğünü kullanırsanız, o üyeyi array.length parametresini artırarak bir diziyi genişletirseniz, yeni değerler tanımsız olarak başlar. Gerçekte, Javascript uygulamaları muhtemelen dizi depolama alanını optimize eder ve tanımlanmamış değerlerin bazıları veya tümü bellekte yer alamaz.
new Array(1)[0] === undefined
ancak değer boş. [undefined][0] === undefined
ancak değer ayarlanmıştır; Dizi sahip bir değer. Sadece mükemmel cevap kullanıyor in
ya hasOwnProperty()
- idx in array
ya array.hasOwnProperty(idx)
bu cevabı --per: stackoverflow.com/a/39171620/3120446
Bunu sadece yapamaz mıyız:
if(arrayName.length > 0){
//or **if(arrayName.length)**
//this array is not empty
}else{
//this array is empty
}
if(arrayName.length) {...
herhangi bir fark?
if(arrayName.length) {...
başarısıznull
[undefined, undefined]
uzunluğu = 2 olan bir dizi olan bu başarısız olur .
Yalnızca kullanmak .length
güvenli değildir ve bazı tarayıcılarda hataya neden olur. İşte daha iyi bir çözüm:
if(array && array.length){
// not empty
} else {
// empty
}
veya şunları kullanabiliriz:
Object.keys(__array__).length
if(!arrayName[index]){
// do stuff
}
if(arrayName.length > index && arrayName[index] !== null) {
//arrayName[index] has a value
}
x == null
sadece null veya undefined için geçerli olacak, başka bir şey olmayacak. Aynı şekilde, x != null
null ya da undefined olmayan her şey için de geçerli olacaktır. Özellikle tanımsız olarak bakmanız gerekmedikçe, örtük dönüşüm iyiliğine yaslanın.
Kısa ve evrensel yaklaşım
Herhangi bir diziyi yanlış değerleri (false, undefined, null veya empty string gibi) olup olmadığını kontrol etmek isterseniz, aşağıdaki gibi her () yöntemi kullanabilirsiniz :
array.every(function(element) {return !!element;}); // returns true or false
Örneğin:
['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
Bir falsy değerinin ilk dizinini almanız gerekiyorsa, bunu şu şekilde yapabilirsiniz:
let falsyIndex;
if(!['23', true, 2, null, {key: 'value'}].every(function(element, index) {falsyIndex = index; return !!element;})) {
console.log(falsyIndex);
} // logs 3
Belirli bir dizin için bir dizinin sahte bir değerini kontrol etmeniz gerekiyorsa, bunu şu şekilde yapabilirsiniz:
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' -> öğelerini null veya '' değerine eşitlerseniz, bu durumda: Tüm 'null' öğeleri filtreledikten sonra dizinin boş olup olmadığını kontrol edin
if(!arr.clean().length){return 'is null'}
Tabii ki, önce Temiz yöntemi ekleyin :
Array.prototype.clean=function(){return this.filter(function(e){return (typeof e !=='undefined')&&(e!= null)&&(e!='')})}
Bunun gibi bir işlev oluşturmanızı tavsiye ederim:
function isEmptyEl(array, i) {
return !(array[i]);
}
Buna şöyle diyebilirsiniz:
if (isEmptyEl(arrayName, indexVal)) {
console.log('arrayName[' + indexVal + '] is empty');
}
Geliştiriciyi isEmptyEl arabirimine uymaya zorlamak, tanımlanmamış bir diziAdı veya indexVal değişkenleri gibi giriş hatalarını yakalar.
(Javascript'te programlama yaparken defalarca programlamak genellikle iyi bir uygulamadır.)
DiziAdı tanımlanmadıysa şöyle bir hata mesajı alırsınız:
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)
Tanımlanmamış bir dizin için benzer sonuçlar
Dizi veya dizin değerleri yoksa bir hata iletisi alırsınız.
Geçerli giriş için, yalnızca arrayName [indexVal] aşağıdakilerden herhangi biri ise doğru olur:
"Boş" ile ne demek istediğinize bağlıdır.
Bu ada sahip bir özelliği olmayan bir nesnede bir özelliğin değerini almaya çalıştığınızda, değeri alırsınız undefined
.
Seyrek dizilerle olan budur: arasındaki 0
ve array.length-1
mevcut olan tüm indeksler değildir .
Böylece olup olmadığını kontrol edebilirsiniz array[index] === undefined
.
Ancak, özellik index
bir undefined
değerle var olabilir . Bu durumu filtrelemek istiyorsanız, in
işleci veya bir nesnenin JavaScript'te bir özelliği olup olmadığını nasıl kontrol edebilirim? BölümündehasOwnProperty
açıklandığı gibi kullanabilirsiniz.
index in array;
array.hasOwnProperty(index);
undefined
Veya null
değeri olan varolan bir mülkün mevcut olmadığını düşünüyorsanız, gevşek karşılaştırmayı array[index] == undefined
veya kullanabilirsiniz array[index] == null
.
Dizinin seyrek olmadığını biliyorsanız, index
ile karşılaştırabilirsiniz array.length
. Ancak güvenli olmak için, index
gerçekten bir dizi dizini olduğundan emin olmak isteyebilirsiniz , bkz. Özellik adının dizi dizini olup olmadığını kontrol etme
Tamam, önce JavaScript'te bir dizi değeri yoksa ne olacağını görelim, bu yüzden aşağıdaki gibi bir dizimiz varsa:
const arr = [1, 2, 3, 4, 5];
ve şimdi 6'nın indeks 5'te olup olmadığını kontrol ediyoruz :
arr[5];
ve anlıyoruz
undefined
...
Bu temelde bize cevap, tanımsız olup olmadığını kontrol etmenin en iyi yolu , bu yüzden böyle bir şey:
if("undefined" === typeof arrayName[index]) {
//array value is not there...
}
Bu durumda bunu YAPMAMAK daha iyidir :
if(!arrayName[index]) {
//Don't check like this..
}
Çünkü şu diziye sahip olduğumuzu hayal edin:
const arr = [0, 1, 2];
ve yapıyoruz:
if(!arr[0]) {
//This get passed, because in JavaScript 0 is falsy
}
Gördüğünüz gibi, 0 bile var, tanınmıyor, aynı şeyi yapabilen ve uygulama buggy yapabileceğiniz başka şeyler var, bu yüzden dikkatli olun, hepsini listeliyorum:
undefined
''
Ben birkaç kaçırmış gibi görünüyor bir şey işaret etmek istiyorum: yani dizinin ortasında "boş" bir dizi pozisyon olması mümkündür. Aşağıdakileri göz önünde bulundur:
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
Daha sonra kontrol etmenin doğal yolu dizi üyesinin tanımsız olup olmadığını görmek olacaktır, başka yollar varsa emin değilim
if (arr[index] === undefined) {
// member does not exist
}
Lodash ile şunları yapabilirsiniz:
if(_.has(req,'documents')){
if (req.documents.length)
_.forEach(req.documents, function(document){
records.push(document);
});
} else {
}
if(_.has(req,'documents'))
istek nesnemizin adlı bir özelliğe sahip olup olmadığını kontrol etmek documents
ve bu pervane varsa, bir sonraki if (req.documents.length)
, boş bir dizi değilse doğrulamaktır, böylece benzeri diğer şeyler forEach
devam edebilir.
Daha önce tanımlanmadığını veya silinip silinmediğini kontrol etmek için:
if(typeof arrayName[index]==="undefined"){
//the index is not in the array
}
ayrıca bazı dizini sildiğiniz ilişkilendirilebilir diziler ve dizilerle de çalışır
Hiçbir zaman tanımlanıp tanımlanmadığını kontrol etmek için VEYA boş veya mantıksal bir boş değerdir (NaN, boş dize, yanlış):
if(typeof arrayName[index]==="undefined"||arrayName[index]){
//the index is not defined or the value an empty value
}
Laravel datatables kullanarak bu sorunla karşılaştım. properties
Bir etkinlik günlüğünde çağrılan bir JSON değeri saklıyordu ve bu değerin boş olup olmamasına dayalı bir düğme göstermek istedim.
Datatables bunu boşsa bir dizi ve eğer değilse bir nesne olarak yorumluyordu, bu nedenle aşağıdaki çözüm benim için çalıştı:
render: function (data, type, full) {
if (full.properties.length !== 0) {
// do stuff
}
}
Bir nesnenin length özelliği yoktur.
Bu kararın, zorunlu OOP veya prosedür yerine bildirimsel fonksiyonel programlamayı tercih eden erkekler için uygun olduğunu düşünüyorum. Sorunuz " İçeride bazı değerler var mı? (Doğruluk mu yoksa yanlış bir değer mi)".some
ise, içindeki değerleri doğrulamak için yöntemi kullanabilirsiniz .
[].some(el => el || !el);
function isEmpty(arr) { ... }
.[].length
sonuçlanımını için 0
hangi bazı durumlarda tehlikelidir.[].length > 0
deyiş "sıfırdan uzunluğu üzerinde mi?"Gelişmiş örnekler:
[ ].some(el => el || !el); // false
[null].some(el => el || !el); // true
[1, 3].some(el => el || !el); // true
Bunu daha verimli yapmak için Loadsh kütüphanesini kullanabilirsiniz, örneğin:
"evcil hayvanlar" adında bir diziniz varsa, örneğin:
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) ) });
Tüm dizi değerlerini null veya undefined değerleri olup olmadığını denetlemek için:
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/ adresinde daha fazla örneği inceleyin
fn(){}
sözdizimi hatasıdır ve bunun bir dizi öğesinin belirli bir dizinde var olup olmadığını kontrol etmeye nasıl yardımcı olduğu açık değildir.