2009-10-26 32 views
6

Tôi muốn kiểm tra chức năng của mình nếu đối số đã nhập của đối tượng kiểu có trống hay không. Đôi khi nó trống rỗng nhưng vẫn không rỗng, do đó tôi không thể dựa vào điều kiện rỗng. Có một số tài sản như 'chiều dài'/'kích thước' cho các đối tượng flex mà tôi có thể sử dụng ở đây. Xin vui lòng giúp đỡ. Cảm ơn trước.Để kiểm tra xem một đối tượng có trống không hoặc không

+0

Tôi đã gắn thẻ lại câu hỏi của bạn với bộ sưu tập. Câu hỏi của bạn hơi mơ hồ, có lẽ bạn có thể làm rõ nó để có được nhiều câu trả lời tốt hơn. Đang sử dụng một đối tượng Object làm mảng kết hợp? Nếu bạn cần đếm, có thể bạn sử dụng lớp Array thay thế. Nếu bạn mô tả ngữ cảnh tốt hơn một chút thì sẽ dễ trả lời hơn. –

+0

Nếu bạn sử dụng một mảng kết hợp, bạn nhận được chính xác điều tương tự như một đối tượng. Thuộc tính độ dài sẽ luôn trả về 0 bất kể cách bạn điền các phím. – sharvey

+0

Tôi có nghĩa là không sử dụng một mảng kết hợp, nhưng thay đổi mã để sử dụng một mảng bình thường. Một mảng kết hợp cho biết rằng bạn biết giá trị nào được lưu trữ và bạn sẽ không cần phải tính giá trị đó. Nhưng thật khó để nói mà không có chi tiết hơn. –

Trả lời

15

Nếu bạn có nghĩa là nếu một đối tượng không có thuộc tính:

var isEmpty:Boolean = true; 
for (var n in obj) { isEmpty = false; break; } 
+0

Cảm ơn sự giúp đỡ, nó thực sự hữu ích nhưng chúng tôi vẫn không thể có một số phương pháp dựng sẵn như: "myObj.length"/'myObj.isEmpty' Xin cảm ơn một lần nữa. – Ashine

+1

Bạn sẽ phải mở rộng lớp 'Object' hoặc lớp' Dictionary' để có được một phương thức "sẵn có" cho điều đó :) – Amarghosh

+0

Có monkeypatching, nhưng ngắt cho .. trong vòng lặp, mà ... well .. . bạn biết. –

6

Đây là một số nghiêm trọng Hack nhưng bạn có thể sử dụng:

Object.prototype.isEmpty = function():Boolean { 
    for(var i in this) 
     if(i != "isEmpty") 
      return false 
    return true 
} 

var p = {}; 
trace(p.isEmpty()); // true 
var p2 = {a:1} 
trace(p2.isEmpty()); // false 
+0

wow, đó là một thủ thuật thú vị. Bạn vừa gửi cho tôi một nhiệm vụ để tìm hiểu về thành viên nguyên mẫu. Không chắc chắn làm thế nào tôi có thể sử dụng nó, nhưng nó là một chút thú vị của ruột để biết về. – JStriedl

+0

Tôi cố gắng tránh nguyên mẫu, bởi vì trình biên dịch flex phàn nàn rất nhiều. Và tôi phải thừa nhận rằng tôi là một người nghiện tự động hoàn thành ... – sharvey

+0

có thể kiểm tra bằng cách sử dụng 'this.hasOwnProperty (i)', trong trường hợp các thành viên nguyên mẫu khác. –

0

Phụ thuộc vào những gì đối tượng của bạn, hay đúng hơn là những gì bạn mong đợi nó phải có. Ví dụ, nếu đối tượng của bạn có nghĩa vụ phải chứa một số tài sản được gọi là tên mà bạn đang tìm kiếm, bạn có thể làm

if(objSomeItem == null || objSomeItem.name == null || objSomeItem.name.length == 0) 
{ 
trace("object is empty"); 
} 

hoặc nếu đối tượng của bạn là thực sự nghĩa vụ phải được cái gì khác, giống như một mảng bạn có thể làm

var arySomeItems = objSomeItem as Array; 
if(objSomeItem == null || arySomeItems == null || arySomeItems.length == 0) 
{ 
    trace("object is empty"); 
} 

Bạn cũng có thể sử dụng cách khác thông qua phản ánh, chẳng hạn như ObjectUtil.getClassInfo, sau đó liệt kê thông qua các thuộc tính để kiểm tra các giá trị thiết lập .... lớp này giúp đỡ:

import flash.utils.describeType; 
import flash.utils.getDefinitionByName; 

public class ReflectionUtils 
{ 
    /** Returns an Array of All Properties of the supplied object */ 
    public static function GetVariableNames(objItem:Object):Array 
    { 
     var xmlPropsList:XMLList = describeType(objItem)..variable; 
     var aryVariables:Array = new Array(); 
     if (xmlPropsList != null) 
     { 
      for (var i:int; i < xmlPropsList.length(); i++) 
      { 
       aryVariables.push(xmlPropsList[i][email protected]); 
      } 
     } 

     return aryVariables; 
    } 

    /** Returns the Strongly Typed class of the specified library item */ 
    public static function GetClassByName($sLinkageName:String):Class 
    { 
     var tObject:Class = getDefinitionByName($sLinkageName) as Class; 
     return tObject; 
    } 

    /** Constructs an instance of the speicified library item */ 
    public static function ConstructClassByName($sLinkageName:String):Object 
    { 
     var tObject:Class = GetClassByName($sLinkageName); 
     //trace("Found Class: " + tMCDefinition); 
     var objItem:* = new tObject(); 
     return objItem; 
    } 

    public static function DumpObject(sItemName:String, objItem:Object):void 
    { 
     trace("*********** Object Dump: " + sItemName + " ***************"); 
     for (var sKey:String in objItem) 
     { 
      trace(" " + sKey +": " + objItem[sKey]); 
     } 
    } 
    //} 
} 

Một điều cần lưu ý là bạn có thể sử dụng một vòng lặp đơn giản để kiểm tra thông qua một thuộc tính đối tượng, đó là những gì hàm dumpobject này đang làm.

-1

có thể sử dụng sử dụng phương pháp hasProperty để kiểm tra chiều dài

var i:int = myObject.hasProperty("length") ? myObject.length: 0; 
+0

Vấn đề của anh ta là không có trường độ dài trên các đối tượng động. – sharvey

+0

Cách tôi đọc nó là ông không biết nếu có một tài sản dài hay không. – AndrewB

5

Bạn cũng có thể thử:

ObjectUtil.getClassInfo(obj).properties.length > 0 

Những điều tốt về nó là getClassInfo mang đến cho bạn nhiều thông tin hơn về các đối tượng, ví dụ. bạn có được tên của tất cả các thuộc tính trong đối tượng, có thể có ích.

+0

Cảm ơn U :) Nó đã giảm nỗ lực của tôi ... – Prax

2

Nếu đối tượng chứa một số 'văn bản' nhưng as3 không nhận ra nó dưới dạng Chuỗi, hãy chuyển đổi thành chuỗi và kiểm tra xem nó có trống không.

var checkObject:String = myObject; 

if(checkObject == '') 
{ 
    trace('object is empty'); 
} 
0

Bạn có thể trực tiếp kiểm tra xem nó như sau,

var obj:Object = new Object(); 
if(obj == null) 
{ 
//Do something 
} 
0

tôi lấy trộm này từ một câu hỏi tương tự liên quan đến JS. Nó yêu cầu thư viện FP 11+ hoặc JSON.as.

function isEmptyObject(obj){ 
    return JSON.stringify(obj) === '{}'; 
} 
Các vấn đề liên quan