2011-06-06 223 views
207

如何將對象添加到數組(在javascript或jquery中)? 例如,這段代碼有什麼問題?如何將對象添加到數組

function(){ 
    var a = new array(); 
    var b = new object(); 
    a[0]=b; 
} 

我想使用此代碼來保存函數1數組中的許多對象,並調用函數2來使用數組中的對象。

  1. 如何保存數組中的對象?
  2. 如何將一個對象放入一個數組並將其保存到一個變量中?
+7

請不要不會修正發佈的代碼中的錯誤,如編輯5所做的那樣。如果你糾正了問題中的一個簡單錯誤,通常沒有理由存在這個答案。 – Paul 2015-08-06 03:01:31

回答

41

首先,沒有objectarray。有ObjectArray。其次,你可以做到這一點:

a = new Array(); 
b = new Object(); 
a[0] = b; 

現在a將與b數組作爲其唯一的元素。

+2

+1爲最不復雜的答案。我已經在下面擴展它,以包括OP的問題2的答案。 – Sam 2011-06-06 15:34:11

468

使用Array.push()將任何東西放入數組中。

var a=[], b={}; 
a.push(b);  
// a[0] === b; 

陣列上的額外信息

一次添加多個項目

var x = ['a']; 
x.push('b', 'c'); 
// x = ['a', 'b', 'c'] 

項目添加到一個數組的開始

var x = ['c', 'd']; 
x.unshift('a', 'b'); 
// x = ['a', 'b', 'c', 'd'] 

一個陣列中的內容添加到另一個

var x = ['a', 'b', 'c']; 
var y = ['d', 'e', 'f']; 
x.push.apply(x, y); 
// x = ['a', 'b', 'c', 'd', 'e', 'f'] 
// y = ['d', 'e', 'f'] (remains unchanged) 

創建從內容兩個陣列

var x = ['a', 'b', 'c']; 
var y = ['d', 'e', 'f']; 
var z = x.concat(y); 
// x = ['a', 'b', 'c'] (remains unchanged) 
// y = ['d', 'e', 'f'] (remains unchanged) 
// z = ['a', 'b', 'c', 'd', 'e', 'f'] 
+0

我也有一個問題:myArray = []; myArray.push({'text':'一些文本','id':13});現在myArray是空的。所以如果我們嘗試從myArray [0] ['text']獲取值,它將是空的,爲什麼? http://take.ms/jSvbn – fdrv 2016-03-16 14:55:28

+0

有些東西看起來不對。確保沒有範圍問題。使用let/var來聲明myArray。因爲myArray.push將始終改變myArray。 – 2016-03-16 19:14:25

6

obejct顯然是一個錯字的一個新的數組。但objectarray都需要大寫字母。

您可以使用短手中new Arraynew Object這些都是[]{}

您可以將數據推送到使用.push數組。這將它添加到數組的末尾。或者你可以設置一個索引來包含數據。

function saveToArray() { 
    var o = {}; 
    o.foo = 42; 
    var arr = []; 
    arr.push(o); 
    return arr; 
} 

function other() { 
    var arr = saveToArray(); 
    alert(arr[0]); 
} 

other(); 
+0

教育職位舉例,好 – GoldBishop 2017-03-29 13:27:18

0

如果您使用自己的代碼,則會遇到範圍問題。如果您打算在它們之間使用它(或者如果調用,將它作爲參數傳遞),則必須在函數之外聲明它。

var a = new Array(); 
var b = new Object(); 

function first() { 
a.push(b); 
// Alternatively, a[a.length] = b 
// both methods work fine 
} 

function second() { 
var c = a[0]; 
} 

// code 
first(); 
// more code 
second(); 
// even more code 
8

擴大加比Purcaru的回答包括回答數2

a = new Array(); 
b = new Object(); 
a[0] = b; 

var c = a[0]; // c is now the object we inserted into a... 
34
var years = []; 
for (i= 2015;i<=2030;i=i+1) 
{ 
years.push({operator : i}) 
} 

這裏陣列年內有類似

years[0]={operator:2015} 
years[1]={operator:2016} 

繼續這樣的值。

2
a=[]; 
a.push(['b','c','d','e','f']); 
+3

嗨,歡迎來到SO。請不要將代碼轉儲爲答案。解釋你的想法,以便用戶更好地理解正在發生的事情。謝謝。 – Cthulhu 2016-03-17 09:50:30

+2

好吧。我將來會處理這件事。感謝您的建議... – 2016-03-17 11:13:48

+1

你仍然可以編輯和解釋。 – Santosh 2017-04-26 08:34:43

2

我做對象創建者,支持自動列表的方式:

var list = []; 

function saveToArray(x) { 
    list.push(x); 
}; 

function newObject() { 
    saveToArray(this); 
}; 
-2

你可以使用這個JavaScript原型的是這樣的:

Array.prototype.push.apply(array1, array2,array3); 

=>陣列1包含它們

其餘
2

關於替代答案是這樣的。

,如果你有像這樣的數組:var contacts = [bob, mary];

,並要放在另一個數組這個數組中,你可以做,以這樣的方式

聲明函數構造

function add (firstName,lastName,email,phoneNumber) { 
this.firstName = firstName; 
this.lastName = lastName; 
this.email = email; 
this.phoneNumber = phoneNumber; 
} 

使物體起作用:

var add1 = new add("Alba","Fas","[email protected]","[098] 654365364"); 

並添加到陣列的對象:

contacts[contacts.length] = add1; 
12
  • JavaScript是case-sensitive。調用new array()new object()將拋出一個ReferenceError,因爲它們不存在。
  • 由於其error-prone behavior,最好避免new Array()
    相反,分配新陣列= [val1, val2, val_n];。對於物體,請使用= {}
  • 擴展數組有很多方法(如John的answer所示),但最安全的方法是使用concat而不是pushconcat返回一個新數組,保持原始數組不變。 push改變了調用數組should be avoided,特別是如果數組是全局定義的。
  • 爲了避免意外的突變或副作用,對象(數組也是一個對象)也是一個很好的練習freeze。凍結對象既不可變也不可擴展(淺)。

運用這些點並回答你兩個問題,你可以定義一個函數是這樣的:

function appendObjTo(thatArray, objToAppend) { 
    return Object.freeze(thatArray.concat(objToAppend)); 
} 

用法:

// Given 
const myArray = ["A","B"]; 
const myObject = {hello: "world!"}; 
// "save it to a variable" 
const newArray = appendObjTo(myArray, myObject); // returns: ["A","B",{hello: "world!"}] 
// myArray and myObject did not change. 
+0

「用法」是什麼使這個我個人首選的答案。 – HPWD 2017-10-03 20:59:59

+0

@boghyon,我很好奇凍結和突變。你是在談論由於concat方法可能直接發生的數組更改,還是因爲在執行'.concat()'的過程中可能會從腳本的其他地方對數組進行更改?如果第二個,不應該由於javascript是單線程而自動阻止,即使在異步代碼的情況下,因爲控制應該至少在理論上不會被返回,直到方法完成? – jdmayfield 2018-02-01 19:30:55

+0

@jdmayfield:JS的評估策略是[*通過對象共享*調用](https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing)。當對象傳遞時,它們不會被複制。這些對象中的突變在被傳遞的時候,對調用者來說總是**立即可見的,而不管突變體是否被異步調用,完成或不調用。由於這些副作用常常導致bug,因此我們將返回新對象,與原始對象分離。使對象不可變(例如通過「凍結」)只是防止意外突變的額外步驟。 – boghyon 2018-02-01 22:36:10

0

/* array literal */ 
 
var aData = []; 
 

 
/* object constructur */ 
 
function Data(firstname, lastname) { 
 
    this.firstname = firstname; 
 
    this.lastname = lastname; 
 
    this.fullname = function() { 
 
    return (this.firstname + " " + this.lastname); 
 
    }; 
 
} 
 

 
/* store object into array */ 
 
aData.push(new Data("Jhon", "Doe")); 
 
aData.push(new Data("Anna", "Smith")); 
 
aData.push(new Data("Black", "Pearl")); 
 

 
/* convert array of object into string json */ 
 
var jsonString = JSON.stringify(aData); 
 
document.write(jsonString); 
 

 
/* loop arrray */ 
 
for (var x in aData) { 
 
    alert(aData[x].fullname()); 
 
}