2013-01-05 80 views
4

我試圖通過循環爲數組中的每個項目創建一個新對象。對象的名稱應該基於數組的鍵。在循環中創建新的對象實例

因此,對於此陣:

var arr = new Array(
    "some value", 
    "some other value", 
    "a third value" 
); 

會導致三個對象:

alert(object1.value); 
alert(object2.value); 
alert(object3.value); 

我迄今(但不工作)的代碼是:

// Object 
function fooBar(value) { 
    this.value = value; 
    ... 
} 

// Loop 
var len = arr.length; 
for (var i = 0; i < len; i++) { 
    var objectName = object + i; 
    var objectName = new fooBar(arr[i]); 
} 

我要求的是甚麼意義?

+1

'objectName'被聲明兩次。 – elclanrs

回答

7

你必須使對象的數組也

var objs = new Array(); 

for(var i = 0; i < len; i++) { 
    objs[i] = new fooBar(arr[i]); 
} 

alert(objs[0].value); 
+0

啊。得到它了。謝謝 – Phil

4

你問的是有道理的,但不應該是你如何建立你的JavaScript出來。

從技術上講,有一種方法可以創建動態生成名稱的變量,但不應該使用它,因爲速度很慢,並且如果用戶指定數組中的內容,則它不安全,並且需要幾年,所以你的舊東西可能會在未來的瀏覽器中打破。

同時,你可以很容易地做一些事情,如:

var obj = {}, 
    arr = [ "one", "two", "three" ], 

    i = 0, 
    len = arr.length, 
    val = "", 
    name = ""; 

for (; i < len; i += 1) { 
    name = "item" + i; 
    val = arr[i]; 
    obj[name] = val; 
} 

現在,您可以撥打obj.item1; // "two"

如果你真的絕望了,你可以使用windowobj所以,當你以書面的東西在全球範圍內,你可以寫item0; // "one",但這確實不是一個好主意,因爲一些原因(可讀性,可維護性,覆蓋別人屬性的可能性等)。

4

你可以映射你的數組:一次

alert(fooBars[0].value); 
// etc. 

或處理它們:

var arr = new Array(
    "some value", 
    "some other value", 
    "a third value" 
); 
var fooBars = arr.map(function(x) { return new fooBar(x); }); 

然後你就可以訪問每個值

fooBars.forEach(function (foo) { alert(foo.value); }); 
3

如果你真的想要的變量名爲so,這裏是一個解決方案

function fooBar(value) { 
    this.value = value; 
} 

var arr = new Array(
    "some value", 
    "some other value", 
    "a third value" 
); 

(function(context) { 
    for (var i = 0; i < arr.length; i++) { 
     var key = 'object' + (i + 1); 
     this[ key ] = new fooBar(arr[ i ]); 
    } 
}(window)); 

alert(object1.value); 
alert(object2.value); 
alert(object3.value); 

如果您不想要全局變量object1 ...只是將關鍵字window替換爲this並且它會生成當前範圍的局部變量。

在這裏測試:http://jsfiddle.net/bukart/F8ham/1/