[英]Associative arrays in javascript
我有這個 object:
function formBuddy()
{
var fields = new Array();
var labels = new Array();
var rules = new Array();
var count=0;
this.addField = function(field, label, rule)
{
fields[count] = field;
labels[field] = label;
rules[field] = rule;
count = ++count;
}
}
它以這種方式使用:
var cForm=new formBuddy();
cForm.addField("c_first_name","First Name","required");
cForm.addField("c_last_name","Last Name","required");
問題是,在addField()
function 中, fields
數組設置正確(可能是因為使用數字索引來引用它),但其他 2 個 arrays ( labels
和rules
)根本沒有被觸及。 做一個console.log
顯示它們在螢火蟲中是空的。
我需要改變什么才能使它們工作? 我還是想通過字段的字符串索引來引用規則和標簽。
改為使用對象:
function formBuddy()
{
var fields = {};
var labels = {};
var rules = {};
var count = 0;
this.addField = function(field, label, rule)
{
fields[count] = field;
labels[field] = label;
rules[field] = rule;
count++;
}
}
但正如Christoph已經提到的那樣 ,我也會將這些信息存儲在一個數據結構中。 例如:
function formBuddy() {
var fields = {};
this.addField = function(name, label, rule) {
fields[name] = {
name: name,
label: label,
rule: rule
};
};
this.getField = function(name) {
return fields[name];
};
}
var cForm=new formBuddy();
cForm.addField("c_first_name","First Name","required");
cForm.addField("c_last_name","Last Name","required");
alert(cForm.getField("c_last_name").label);
fields
應該是一個數組,而labels
和rules
應該是對象,因為您希望使用字符串作為鍵。 此外, addField()
是針對每個實例相同FormBuddy()
的構造函數的名稱應該是大寫),應駐留在原型,即
function FormBuddy() {
this.fields = []; // this is the same as `new Array()`
this.labels = {}; // this is the same as `new Object()`
this.rules = {};
}
FormBuddy.prototype.addField = function(field, label, rule) {
this.fields.push(field);
this.labels[field] = label;
this.rules[field] = rule;
};
您可以通過訪問標簽/規則
var buddy = new FormBuddy();
buddy.addField('foo', 'bar', 'baz');
alert(buddy.labels['foo']);
alert(buddy.rules.foo);
只是為了進一步激怒Luca;),這是另一個版本,它也沒有封裝任何東西:
function FormBuddy() {
this.fields = [];
}
FormBuddy.prototype.addField = function(id, label, rule) {
var field = {
id : id,
label : label,
rule : rule
};
this.fields.push(field);
this['field ' + id] = field;
};
FormBuddy.prototype.getField = function(id) {
return this['field ' + id];
};
var buddy = new FormBuddy();
buddy.addField('foo', 'label for foo', 'rule for foo');
它類似於Gumbo的第二個版本,但他的fields
對象被合並到FormBuddy
實例中。 添加一個名為fields
的數組,以允許快速迭代。
要訪問字段的標簽,規則或ID,請使用
buddy.getField('foo').label
要迭代字段,請使用
// list rules:
for(var i = 0, len = buddy.fields.length; i < len; ++i)
document.writeln(buddy.fields[i].rule);
數組在Javascript中被視為對象,因此你的代碼片段工作,只是firebug的console.log
沒有向你顯示數組中的“Objects”,而只是數組值...
使用for(var i in obj)
查看Array包含的對象值:
function formBuddy() {
var fields = new Array();
var labels = new Array();
var rules = new Array();
var count=0;
this.addField = function(field, label, rule)
{
fields[count] = field;
labels[field] = label;
rules[field] = rule;
count = ++count;
for(var i in labels) {
console.log(labels[i]);
}
for(var i in rules) {
console.log(rules[i]);
}
console.log(labels.c_last_name);
// or
console.log(labels["c_last_name"]);
}
}
var cForm = new formBuddy();
cForm.addField("c_last_name","Last Name","required");
這是您正在尋找的替代品嗎? 試試看。
<script type="text/javascript">"use strict";
function formBuddy() {
this.fields = new Array();
this.labels = new Array();
this.rules = new Array();
this.count=0;
this.addField = function(field, label, rule)
{
this.fields[this.count] = field;
this.labels[field] = label;
this.rules[field] = rule;
this.count++;
}
}
var cForm = new formBuddy();
// FILLING IN THE DATABASE
cForm.addField("c_first_name","Diasoluka","duplicated");
cForm.addField("c_Middle_name","Nz","inspect");
cForm.addField("c_last_name","Luyalu","mandatory");
cForm.addField("c_first_name","Diasoluka","duplicated");
console.log(`ACCESSING EACH PROPERTY INDIVIDUALLY\n,${'.'.repeat(31)}`);
let el=Object.entries(cForm.fields); // DESTRUCTURING
console.log(Object.is(el,Object.entries(cForm.fields)));
// false
const [f1,f2,f3] = el; // DESTRUCTURING=DÉCOMPOSITION
console.log("FIELDS:\n",f1," | ",f2," | ",f3,"\n\n");
// FIELDS:
// Array [ "0", "c_first_name" ]
// Array [ "1", "c_Middle_name" ]
// Array [ "2", "c_last_name" ]
let labels = Object.entries(cForm.labels); // DESTRUCTURING
const [l1,l2,l3] = labels; // DESTRUCTURING
console.log("LABELS:\n",l1," | ",l2," | ",l3,"\n\n");
// LABELS:
// Array [ "c_first_name", "Diasoluka" ]
// Array [ "c_Middle_name", "Nz" ]
// Array [ "c_last_name", "Luyalu" ]
let rules = Object.entries(cForm.rules); // DESTRUCTURING
const [r1,r2,r3] = rules; // DESTRUCTURING
console.log("RULES:\n",r1," | ",r2," | ",r3,"\n\n");
// RULES:
// Array [ "c_first_name", "duplicated" ]
// Array [ "c_Middle_name", "inspect" ]
// Array [ "c_last_name", "mandatory" ]
console.log(`PAESING THE DATABASE =\nACCESSING ALL THE FIELDS AT ONCE\n,${'.'.repeat(31)}`);
for(let key in cForm.fields){
let el=cForm.fields[key]; // ASSIGNMENT=AFFECTATION
console.log(Object.is(el,cForm.fields[key]));
// true true true true
console.log(`${el} // ${cForm.labels[el]} // ${cForm.rules[el]}\n`);
}
// c_first_name // Diasoluka // duplicated
// c_Middle_name // Nz // inspect
// c_last_name // Luyalu // mandatory
// c_first_name // Diasoluka // duplicated
console.log("\n");
console.log(`THE INNER STRUCTURE OF OUR cForm OBJECT\n,${'.'.repeat(31)}`);
console.log(Object.entries(cForm)); // DESTRUCTURING
// (5) [Array(2), Array(2), Array(2), Array(2), Array(2)]
// 0: (2) ['fields', Array(4)]
// 1: (2) ['labels', Array(0)]
// 2: (2) ['rules', Array(0)]
// 3: (2) ['count', 4]
// 4: (2) ['addField', ƒ]
// length: 5
// [[Prototype]]: Array(0)
</script>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.