ฉันจะตรวจสอบ JavaScript ได้อย่างไรถ้ามีค่าอยู่ในดัชนีอาร์เรย์ที่แน่นอน


521

จะทำงานเพื่อทดสอบว่าค่า "ตำแหน่ง" ดัชนีมีอยู่หรือไม่หรือมีวิธีที่ดีกว่า:

if(arrayName[index]==""){
     // do stuff
}

6
โปรดทราบว่าไม่ต้องการตรวจสอบว่าอาร์เรย์ทั้งหมดว่างเปล่าหรือเปล่าเพียงแค่ตำแหน่งที่มีค่าดัชนีเป็น "ดัชนี"
Ankur

ชื่อสามารถปรับปรุงได้โดยพูดว่า "ฉันจะตรวจสอบ JavaScript ได้อย่างไรถ้ามีค่าอยู่ในดัชนีอาร์เรย์"
demisx

คำตอบ:


738

แนวคิดอาร์เรย์ใน 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
}  

6
มีความเป็นไปได้สูงที่ OP จะรู้ว่าอาเรย์นั้นเกี่ยวข้องกับอะไร แต่เพื่อความสมบูรณ์: โดยทั่วไปแล้ววัตถุที่มีลักษณะคล้ายอาเรย์ก็จะมีlengthคุณสมบัติอยู่ด้วยซึ่งในกรณีนี้สองตัวอย่างในภายหลังนั้นเหมาะสมกว่า
Justin Johnson

9
คุณมักจะสามารถแทนที่foo !== 'undefined' && foo !== nullมีเพียงfoo != null
thinklinux

1
@TheComposer ตามภาษาที่ขนาดของอาร์เรย์ใน Javascript นั้นจะถูกกำหนดโดย array.length และอาร์เรย์มีการกล่าวถึงประกอบด้วยองค์ประกอบทั้งหมดจากการ0 array.length - 1ไม่ใช่ว่าค่าทั้งหมดเหล่านี้จะถูกกำหนดค่าไว้ หากคุณใช้คีย์เวิร์ดลบในสมาชิกอาเรย์มันจะตั้งค่าสมาชิกนั้นกลับไปเป็นไม่ได้กำหนดเช่นเดียวกับถ้าคุณขยายอาร์เรย์โดยการเพิ่มพารามิเตอร์ array.length ของมันค่าใหม่จะเริ่มเป็นไม่ได้กำหนด ในความเป็นจริงการใช้งานจาวาสคริปต์อาจเพิ่มประสิทธิภาพการจัดเก็บอาร์เรย์และค่าที่ไม่ได้กำหนดบางส่วนหรือทั้งหมดอาจไม่มีหน่วยความจำ
thomasrutter

1
array.length ไม่ได้วนซ้ำทุกอย่างมันเป็นเพียงตัวเลขเดียว
thomasrutter

1
คำตอบนี้ไม่ครอบคลุมกรณีที่ไม่ได้ตั้งค่าดัชนีอาร์เรย์ new Array(1)[0] === undefinedแต่ค่าว่างเปล่า [undefined][0] === undefinedแต่มีการตั้งค่า อาร์เรย์มีค่า เพียงคนเดียวที่สมบูรณ์แบบคำตอบคือการใช้inหรือhasOwnProperty()- idx in arrayหรือarray.hasOwnProperty(idx)--per คำตอบนี้: stackoverflow.com/a/39171620/3120446
dx_over_dt

350

เราไม่สามารถทำสิ่งนี้ได้:

if(arrayName.length > 0){   
    //or **if(arrayName.length)**
    //this array is not empty 
}else{
   //this array is empty
}

10
คำถามคือเกี่ยวกับวิธีทดสอบว่ามีดัชนีเฉพาะของอาร์เรย์อยู่หรือไม่
thomasrutter

26
จะif(arrayName.length) {...สร้างความแตกต่างหรือไม่?
siannone

10
ทำไม upvotes มากมาย? ชัดเจนไม่ตอบคำถาม
algiogia

10
if(arrayName.length) {...ล้มเหลวในnull
Ronnie Royston

5
สิ่งนี้ล้มเหลว[undefined, undefined]ซึ่งเป็นอาร์เรย์ที่มีความยาว = 2
Soldeplata Saketos

41

การใช้เพียงอย่างเดียว.lengthไม่ปลอดภัยและจะทำให้เกิดข้อผิดพลาดในเบราว์เซอร์บางตัว นี่คือทางออกที่ดีกว่า:

if(array && array.length){   
   // not empty 
} else {
   // empty
}

หรือเราสามารถใช้:

Object.keys(__array__).length

2
«โปรดทราบว่าไม่ต้องการตรวจสอบว่าอาร์เรย์ทั้งหมดว่างเปล่าหรือเปล่าเพียงแค่ตำแหน่งที่มีค่าดัชนีเป็น "ดัชนี" »
Oriol

คำตอบที่ดีสั้นและง่ายสำหรับผู้ที่ต้องการตรวจสอบอาร์เรย์ทั้งหมด
Luis Martins

23
if(!arrayName[index]){
     // do stuff
}

8
นี้จะทำสิ่งต่าง ๆ ถ้ามีค่าอาร์เรย์ แต่เป็น 0, null, "" ฯลฯ
thomasrutter

โทมัสพูดถูก อย่างไรก็ตามนี่ก็เพียงพอแล้วสำหรับหลาย ๆ กรณี (ซึ่งคุณควรจะแจกแจง)
Justin Johnson

โดยวิธีที่ง่ายที่สุด
ผู้ทำลาย

8
if(arrayName.length > index && arrayName[index] !== null) {
    //arrayName[index] has a value
}

@thomasrutter ฉันมีปัญหาในการหาทางที่จะเป็นไปได้ที่จะจบลงด้วยองค์ประกอบอาร์เรย์ที่ไม่ได้กำหนด
Rex M

อืม (myarray [1] = undefinedvariable) ใช้งานได้หรือไม่ หรือเพียงแค่ (myarray [1] = ไม่ได้กำหนด)?
thomasrutter

@thomasrutter ทั้งสองอย่างนี้จะเป็นข้อยกเว้นใช่ไหม? (undefinedvariable ไม่ได้ถูกกำหนด)
Rex M

1
คุณสามารถทดสอบด้วยตัวคุณเองโดยใช้บางอย่างเช่น Firebug ใน Javascript การอ่านค่าของตัวแปรที่ไม่ได้กำหนดจะไม่ส่งข้อยกเว้น แต่จะคืนค่าที่ไม่ได้กำหนด
thomasrutter

@thomasrutter คุณผิดในความคิดเห็นแรกของคุณ x == nullจะเคยเป็นจริงสำหรับโมฆะหรือไม่ได้กำหนดไม่มีอะไรอื่น เช่นเดียวกันx != nullจะเป็นจริงสำหรับทุกสิ่งที่ไม่เป็นโมฆะหรือไม่ได้กำหนดไว้ ยกเว้นว่าคุณต้องการค้นหาแบบไม่เจาะจงโดยเฉพาะเพียงแค่อาศัยความดีในการแปลงที่ชัดเจน
Marcus Stade

8

วิธีการสั้นและสากล

หากคุณต้องการตรวจสอบอาเรย์ใด ๆ หากมันมีค่าเท็จ (เช่นเท็จ, ไม่ได้กำหนด, เป็นโมฆะหรือสตริงว่าง) คุณสามารถใช้ทุกวิธี()เช่นนี้:

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
}

6
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!='')})}

5

ฉันอยากจะแนะนำการสร้างฟังก์ชั่นเช่นนี้:

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] เป็นอย่างใดอย่างหนึ่งต่อไปนี้:

  • โมฆะ
  • ไม่ได้กำหนด
  • น่าน
  • สตริงว่าง
  • 0
  • เท็จ

5

ขึ้นอยู่กับความหมายของคำว่า "empty"

เมื่อคุณพยายามที่จะได้รับมูลค่าของทรัพย์สินที่อยู่บนวัตถุที่มีคุณสมบัติใด ๆ undefinedกับชื่อที่คุณจะได้รับความคุ้มค่า

นั่นคือสิ่งที่เกิดขึ้นกับอาร์เรย์หร็อมแหร็ม: ไม่ใช่ดัชนีทั้งหมดระหว่าง0และarray.length-1มีอยู่

array[index] === undefinedเพื่อให้คุณสามารถตรวจสอบว่า

อย่างไรก็ตามคุณสมบัติindexอาจมีอยู่ด้วยundefinedค่า หากคุณต้องการกรองกรณีนี้คุณสามารถใช้inโอเปอเรเตอร์หรือhasOwnPropertyตามที่อธิบายไว้ในฉันจะตรวจสอบว่าวัตถุมีคุณสมบัติใน JavaScript ได้อย่างไร

index in array;
array.hasOwnProperty(index);

หากคุณต้องการพิจารณาทรัพย์สินที่มีอยู่กับundefinedหรือnullมูลค่าให้ได้อยู่ที่คุณสามารถใช้การเปรียบเทียบหลวมหรือarray[index] == undefinedarray[index] == null

ถ้าคุณรู้ว่าอาร์เรย์ไม่เบาบางคุณสามารถเปรียบเทียบกับindex array.lengthแต่เพื่อความปลอดภัยคุณอาจต้องการตรวจสอบให้แน่ใจว่าindexเป็นดัชนีอาร์เรย์จริงๆหรือไม่ดูที่ตรวจสอบว่าชื่อคุณสมบัติเป็นดัชนีอาร์เรย์หรือไม่


2
นี่เป็นคำตอบเดียวที่จะทำการกลั่นกรองรายการอาเรย์ที่ไม่มีการตั้งค่าอย่างเหมาะสม (ซึ่งไม่มีค่าใด ๆ ) และรายการที่ตั้งค่าเป็นค่าที่ไม่ได้กำหนด 2 สถานะจะเบลอโดยข้อเท็จจริงที่ว่าการเข้าถึงรายการอาเรย์ที่ไม่ได้ตั้งค่าส่งคืนไม่ได้กำหนด แต่จะแตกต่างกัน
olivr

ใช้ hasOwnProperty เมื่อคุณมีอาร์เรย์ที่มีค่าที่อาจไม่ได้ตั้งค่า (แตกต่างจาก undefined หรือ null)
CMCDragonkai

1

ตกลงก่อนอื่นเรามาดูว่าจะเกิดอะไรขึ้นถ้าไม่มีค่าอาร์เรย์ใน 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ก็ยังไม่เป็นที่รู้จักมีสิ่งอื่น ๆ อีกสองสามอย่างที่สามารถทำเช่นเดียวกันและทำให้แอพพลิเคชั่นรถคุณดังนั้นโปรดระวังฉันลงรายการทั้งหมด:

  1. ไม่ได้กำหนด : หากค่าไม่ได้ถูกกำหนดและเป็นundefined
  2. null : ถ้าเป็นโมฆะตัวอย่างเช่นถ้าไม่มีองค์ประกอบ DOM ...
  3. สตริงว่าง :''
  4. 0 : หมายเลขศูนย์
  5. NaN : ไม่ใช่ตัวเลข
  6. เท็จ

1

ฉันอยากจะชี้ให้เห็นบางสิ่งที่พลาดไม่ได้: นั่นคือมีความเป็นไปได้ที่จะมีตำแหน่งอาเรย์ "ว่างเปล่า" ที่อยู่ตรงกลางอาเรย์ของคุณ พิจารณาสิ่งต่อไปนี้:

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
}


0

ด้วย 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สามารถดำเนินการต่อไป


0

หากต้องการตรวจสอบว่ายังไม่ได้กำหนดหรือลบออก:

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
}

0

ฉันพบปัญหานี้โดยใช้ข้อมูล laravel ฉันกำลังจัดเก็บค่า JSON ที่เรียกว่าpropertiesในบันทึกกิจกรรมและต้องการแสดงปุ่มตามค่านี้ว่าว่างเปล่าหรือไม่

ข้อมูลก็แปลว่านี่เป็นอาร์เรย์ถ้ามันว่างเปล่าและวัตถุถ้ามันไม่ดังนั้นวิธีการแก้ปัญหาต่อไปนี้ได้ผลสำหรับฉัน:

render: function (data, type, full) {
    if (full.properties.length !== 0) {
        // do stuff
    }
}

วัตถุไม่มีคุณสมบัติความยาว


0

ฉันคิดว่าการตัดสินใจนี้เหมาะสำหรับคนที่ชอบการเขียนโปรแกรมฟังก์ชั่นที่เปิดเผยมากกว่า 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

-1

คุณสามารถใช้ห้องสมุด 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(){}เป็นข้อผิดพลาดทางไวยากรณ์และยังไม่ชัดเจนว่าจะช่วยตรวจสอบว่ารายการอาร์เรย์มีอยู่ที่ดัชนีที่แน่นอนหรือไม่
Oriol
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.