2016-12-01 50 views
1

我想製作一個化學計算器,我可以在其中放入元素字母,如「H」,「他」,「O」等,所以我已經做了一個叫做元素的數組。然後,我對這些值進行了排列。我想要的信件。如果我寫element[x]它會使用value[x]as3 - 使用數組給字母賦值另一個數組

var element:Array = new Array("H", "O") 
var mass:Array = new Array(1.01, 16.01); 

function elements() { 
if (input_Mm.text == element[0]) { 
    Mm = mass[0]; 
} 
if (input_Mm.text == element[1]) { 
    Mm = mass[1]; 
} 
} 

所以,我不必爲每個可能的元素寫一個if語句。

+0

什麼?你的意思是自動完成? –

+0

我的意思是我需要一些方法來不必使用數百如果命令,我會編輯問題中的代碼,以便您可以看到它是如何現在 –

+0

我明白了,謝謝 –

回答

2

您可以使用循環遍歷元素數組,然後使用找到的索引來查找質量數組。

更好的選擇可能是使用字典對象進行直接查找,在這種情況下可能會更好。您可以將字典視爲與數組類似,但將字符串作爲鍵而不是索引號。

在這兩種情況下,如果「input_Mm」是用戶可編輯字段,則可能還需要過濾錯誤的輸入。

+0

謝謝你soo –

2

使用對象

var element_mass:Object = { 
    H: 1.01, 
    O: 16.01 
} 

function elements() { 
    if(element_mass.hasOwnProperty(input_Mm.text)) 
     Mm = element_mass[input_Mm.text]; 
} 
1

的Mendeleiev表包含103點的元素,讓你可以使用一個固定的載體來存儲德DATAS ...

只是爲了簡單...

var mendeleievElmnt:Vector.<String> = new Vector.<String>(103,true); 
var mendeleievMass:Vector.<Number> = new Vector.<Number>(103,true); 
// 103 elements... So a fixed Vector. :) 
function populateMeElmnts():void{ 
    mendeleievElmnt[0] = "H"; 
    mendeleievElmnt[1] = "He"; 
    mendeleievElmnt[2] = "Li"; 
    mendeleievElmnt[3] = "Be"; 
    //... 
} 
function populateMeMass():void{ 
    mendeleievMass[0] = 1; 
    mendeleievMass[1] = 4; 
    mendeleievMass[2] = 6.9; 
    mendeleievMass[3] = 9; 
    //... 
    // O is 16 and not 16.1 but I'm old school ;) 
} 
populateMeElmnts() 
populateMeMass() 
function getElement(el:uint):String{ 
    return ("element[" + (el+1) + "] = " + mendeleievElmnt[el] + ", mass = " + mendeleievMass[el]); 
} 
trace(getElement(2)); 
//OR 
function returnElement(el:uint):Object{ 
    var o:Object = new Object() 

    o["elm"]= mendeleievElmnt[el]; 
    o["elMass"]= mendeleievMass[el]; 
    o["elIndex"]= el+1; 
    return o; 
} 
var elmt:Object = returnElement(2); 
trace("index = " + elmt["elIndex"] + ", elm= " + elmt["elm"] + ", elmtMass = " + elmt["elMass"]); 

輸出:

// element[3] = Li, mass = 6.9 
// index = 3, elm= Li, elmtMass = 6.9 

Vector類實際上效率更高,但我不知道是否期望動態填充所有這些數據...... 在此示例中,您必須在兩個函數中填充103個元素及其Mm。

是否要通過數據庫動態填充這些數據?

無論如何,我強烈建議你避免對象或數組...

有很多的可能性,所以這是我不清楚...... 很抱歉,如果答案是不準確等等。

1°:爲什麼你想得到一個對象來代替Vector的索引? 2°:項目必須是什麼樣子?

@GeorgeProfenza的答案在您的案例中看起來很完美,並讓您有機會在不同的方向工作。

此致敬禮。 Nicolas

1

有多種方法可以做到這一點。 Object方法payam sbr建議非常簡單。

要添加到現有答案中:您可以編寫一個類來表示化學對象值對象(VO)(例如存儲它的名稱,記號,質量等)。):

package { 

    public class Element { 

     private var _name:String; 
     private var _notation:String; 
     private var _mass:Number; 

     public function Element(name:String,notation:String,mass:Number) { 
      _name = name; 
      _notation = notation; 
      _mass = mass; 
     } 

     public function getName():String{ 
      return _name; 
     } 
     public function setName(newName:String):void{ 
      _name = newName; 
     } 

     public function getNotation():String{ 
      return _notation; 
     } 
     public function setNotation(newNotation:String):void{ 
      _notation = newNotation; 
     } 

     public function getMass():Number{ 
      return _mass; 
     } 
     public function setMass(newMass:Number):void{ 
      _mass = newMass; 
     } 

     public function toString():String{ 
       return "[Element name="+_name+" notation="+_notation+" mass="+_mass+"]"; 
     } 
    } 

} 

然後,您可以創建元素的一個維數組和訪問數據的每個元素存儲:

var elements:Vector.<Element> = new Vector.<Element>(); 

elements.push(new Element("Hydrogen","H",1.01)); 
elements.push(new Element("Oxygen","O",16.01)); 

var totalMass:Number = 0; 

for(var i:int = 0; i < elements.length; i++){ 
    trace("elements[",i,"]",elements[i]); 
    totalMass += elements[i].getMass(); 
} 

trace("total mass",totalMass); 

輸出:

elements[ 0 ] [Element name=Hydrogen notation=H mass=1.01] 
elements[ 1 ] [Element name=Oxygen notation=O mass=16.01] 
total mass 17.020000000000003 

注意,一個類型的載體將是快於Object實例的無類型Array。此外as3.0 getters/setters可能會有點慢,因此代碼java風格的get/set方法。

如果你不打算通過大量的元素和性能不必儘可能緊,你可以使用典型的as3 getter/setter行爲像屬性(如果這是更可讀/更容易理解):

package { 

    public class Element { 

     private var _name:String; 
     private var _notation:String; 
     private var _mass:Number; 

     public function Element(name:String,notation:String,mass:Number) { 
      _name = name; 
      _notation = notation; 
      _mass = mass; 
     } 

     public function get name():String{ 
      return _name; 
     } 
     public function set name(newName:String):void{ 
      _name = newName; 
     } 

     public function get notation():String{ 
      return _notation; 
     } 
     public function set notation(newNotation:String):void{ 
      _notation = newNotation; 
     } 

     public function get mass():Number{ 
      return _mass; 
     } 
     public function set mass(newMass:Number):void{ 
      _mass = newMass; 
     } 

     public function toString():String{ 
       return "[Element name="+_name+" notation="+_notation+" mass="+_mass+"]"; 
     } 
    } 

} 

測試代碼:

var elements:Vector.<Element> = new Vector.<Element>(); 

elements.push(new Element("Hydrogen","H",1.01)); 
elements.push(new Element("Oxygen","O",16.01)); 

var totalMass:Number = 0; 

for(var i:int = 0; i < elements.length; i++){ 
    trace("elements[",i,"]",elements[i]); 
    totalMass += elements[i].mass; 
} 

trace("total mass",totalMass); 

如果你使用一個類與Object,你還可以得到自動完成。

如果你想要一個選項接近Object辦法用更少的代碼進行快速原型,你也許可以矇混過關的公共屬性:

package { 

    public class Element { 

     public var name:String; 
     public var notation:String; 
     public var mass:Number; 

     public function Element(name:String,notation:String,mass:Number) { 
      this.name = name; 
      this.notation = notation; 
      this.mass = mass; 
     } 

     public function toString():String{ 
       return "[Element name="+name+" notation="+notation+" mass="+mass+"]"; 
     } 
    } 

} 
+0

清晰,完整和E. Lil可以決定不同的解決方案! 幹得好!給予好評! @GeorgeProfenza – tatactic