จะทำงานเพื่อทดสอบว่าค่า "ตำแหน่ง" ดัชนีมีอยู่หรือไม่หรือมีวิธีที่ดีกว่า:
if(arrayName[index]==""){
// do stuff
}
จะทำงานเพื่อทดสอบว่าค่า "ตำแหน่ง" ดัชนีมีอยู่หรือไม่หรือมีวิธีที่ดีกว่า:
if(arrayName[index]==""){
// do stuff
}
คำตอบ:
แนวคิดอาร์เรย์ใน JavaScript ประกอบด้วยarray.length
องค์ประกอบที่เริ่มต้นด้วยจนถึงarray[0]
array[array.length - 1]
องค์ประกอบอาร์เรย์พร้อมดัชนีi
ถูกกำหนดให้เป็นส่วนหนึ่งของอาร์เรย์ถ้าi
อยู่ระหว่าง0
และarray.length - 1
รวม ถ้าฉันไม่ได้อยู่ในช่วงนี้มันไม่ได้อยู่ในอาร์เรย์
ดังนั้นโดยแนวคิดแล้วอาร์เรย์เป็นแบบเชิงเส้นเริ่มต้นด้วยศูนย์และไปจนถึงค่าสูงสุดโดยไม่มีกลไกใด ๆ สำหรับการมี "ช่องว่าง" ในช่วงนั้นโดยที่ไม่มีรายการอยู่ หากต้องการทราบว่ามีค่าอยู่ในดัชนีตำแหน่งที่กำหนดหรือไม่ (โดยที่ดัชนีเป็น 0 หรือจำนวนเต็มบวก) คุณก็แค่ใช้
if (i >= 0 && i < array.length) {
// it is in array
}
ตอนนี้ภายใต้ประทุนเครื่องยนต์เอนจินจาวาเกือบจะไม่จัดสรรพื้นที่อาเรย์เป็นเส้นตรงและต่อเนื่องเช่นนี้เนื่องจากมันจะไม่สมเหตุสมผลในภาษาไดนามิกและจะไม่มีประสิทธิภาพสำหรับรหัสบางอย่าง พวกเขาอาจจะแฮชตารางหรือผสมกลยุทธ์บางอย่างและช่วงที่ไม่ได้กำหนดของอาร์เรย์อาจไม่ได้จัดสรรหน่วยความจำของตัวเอง อย่างไรก็ตามภาษา 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
คุณสมบัติอยู่ด้วยซึ่งในกรณีนี้สองตัวอย่างในภายหลังนั้นเหมาะสมกว่า
foo !== 'undefined' && foo !== null
มีเพียงfoo != null
0
array.length - 1
ไม่ใช่ว่าค่าทั้งหมดเหล่านี้จะถูกกำหนดค่าไว้ หากคุณใช้คีย์เวิร์ดลบในสมาชิกอาเรย์มันจะตั้งค่าสมาชิกนั้นกลับไปเป็นไม่ได้กำหนดเช่นเดียวกับถ้าคุณขยายอาร์เรย์โดยการเพิ่มพารามิเตอร์ array.length ของมันค่าใหม่จะเริ่มเป็นไม่ได้กำหนด ในความเป็นจริงการใช้งานจาวาสคริปต์อาจเพิ่มประสิทธิภาพการจัดเก็บอาร์เรย์และค่าที่ไม่ได้กำหนดบางส่วนหรือทั้งหมดอาจไม่มีหน่วยความจำ
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
จะเคยเป็นจริงสำหรับโมฆะหรือไม่ได้กำหนดไม่มีอะไรอื่น เช่นเดียวกันx != null
จะเป็นจริงสำหรับทุกสิ่งที่ไม่เป็นโมฆะหรือไม่ได้กำหนดไว้ ยกเว้นว่าคุณต้องการค้นหาแบบไม่เจาะจงโดยเฉพาะเพียงแค่อาศัยความดีในการแปลงที่ชัดเจน
วิธีการสั้นและสากล
หากคุณต้องการตรวจสอบอาเรย์ใด ๆ หากมันมีค่าเท็จ (เช่นเท็จ, ไม่ได้กำหนด, เป็นโมฆะหรือสตริงว่าง) คุณสามารถใช้ทุกวิธี()เช่นนี้:
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' ทั้งหมด
if(!arr.clean().length){return 'is null'}
แน่นอนเพิ่ม วิธีการที่สะอาดก่อน:
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] เป็นอย่างใดอย่างหนึ่งต่อไปนี้:
ขึ้นอยู่กับความหมายของคำว่า "empty"
เมื่อคุณพยายามที่จะได้รับมูลค่าของทรัพย์สินที่อยู่บนวัตถุที่มีคุณสมบัติใด ๆ undefined
กับชื่อที่คุณจะได้รับความคุ้มค่า
นั่นคือสิ่งที่เกิดขึ้นกับอาร์เรย์หร็อมแหร็ม: ไม่ใช่ดัชนีทั้งหมดระหว่าง0
และarray.length-1
มีอยู่
array[index] === undefined
เพื่อให้คุณสามารถตรวจสอบว่า
อย่างไรก็ตามคุณสมบัติindex
อาจมีอยู่ด้วยundefined
ค่า หากคุณต้องการกรองกรณีนี้คุณสามารถใช้in
โอเปอเรเตอร์หรือhasOwnProperty
ตามที่อธิบายไว้ในฉันจะตรวจสอบว่าวัตถุมีคุณสมบัติใน JavaScript ได้อย่างไร
index in array;
array.hasOwnProperty(index);
หากคุณต้องการพิจารณาทรัพย์สินที่มีอยู่กับundefined
หรือnull
มูลค่าให้ได้อยู่ที่คุณสามารถใช้การเปรียบเทียบหลวมหรือarray[index] == undefined
array[index] == null
ถ้าคุณรู้ว่าอาร์เรย์ไม่เบาบางคุณสามารถเปรียบเทียบกับindex
array.length
แต่เพื่อความปลอดภัยคุณอาจต้องการตรวจสอบให้แน่ใจว่าindex
เป็นดัชนีอาร์เรย์จริงๆหรือไม่ดูที่ตรวจสอบว่าชื่อคุณสมบัติเป็นดัชนีอาร์เรย์หรือไม่
ตกลงก่อนอื่นเรามาดูว่าจะเกิดอะไรขึ้นถ้าไม่มีค่าอาร์เรย์ใน JavaScript ดังนั้นถ้าเรามีอาร์เรย์ดังนี้:
const arr = [1, 2, 3, 4, 5];
และตอนนี้เราตรวจสอบว่า6มีที่ดัชนี5หรือไม่:
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
}
ลองนี้ถ้าอาร์เรย์ [ดัชนี] เป็นโมฆะ
if (array[index] != null)
ด้วย 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
}
ยังทำงานร่วมกับอาร์เรย์ที่เชื่อมโยงและอาร์เรย์ที่คุณลบดัชนีบางส่วน
ในการตรวจสอบว่าไม่เคยมีการกำหนดไว้ถูกลบหรือเป็นค่าว่างเปล่าหรือเป็นตรรกะ (NaN, สตริงว่าง, เท็จ):
if(typeof arrayName[index]==="undefined"||arrayName[index]){
//the index is not defined or the value an empty value
}
ฉันพบปัญหานี้โดยใช้ข้อมูล laravel ฉันกำลังจัดเก็บค่า JSON ที่เรียกว่าproperties
ในบันทึกกิจกรรมและต้องการแสดงปุ่มตามค่านี้ว่าว่างเปล่าหรือไม่
ข้อมูลก็แปลว่านี่เป็นอาร์เรย์ถ้ามันว่างเปล่าและวัตถุถ้ามันไม่ดังนั้นวิธีการแก้ปัญหาต่อไปนี้ได้ผลสำหรับฉัน:
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(){}
เป็นข้อผิดพลาดทางไวยากรณ์และยังไม่ชัดเจนว่าจะช่วยตรวจสอบว่ารายการอาร์เรย์มีอยู่ที่ดัชนีที่แน่นอนหรือไม่