2011-11-28 21 views
0

我試圖在多維數組/對象中一次更新多個元素,並且有與.push和其他選項我嘗試過的錯誤。一次更新多個數組元素Javascript

var FEtypes= { 
    textTemplate: { 
     type :"Text", 
     size : 50, 
     required : "no", 
     FEadd : '<input>', 
     label : 'Label', 
     top : 0, 
     left : 0 
    }, 
    textareaTemplate: { 
     type : "Textarea", 
     cols : 30, 
     rows : 5, 
     FEadd :'<textarea>' 
    } 
} 

這可行,但試圖在一行。

FEtypes[1].left = someVariable1; 
FEtypes[1].top = someVariable2; 

我一直不成功:

FEtypes[1].push({left:someVariable1, top:someVariable2}); 

我不斷收到一個錯誤,這是不是一個功能,或者什麼都不做。

+0

我在這裏看不到多維數組。 FEType看起來像一個具有兩個屬性的對象,即textTemplate和textareaTemplate,每個屬性又是一個對象。 – wrschneider

+0

你不能在這樣的對象上使用push。 push用於將元素添加到數組。不覆蓋對象屬性。你的第一個例子有什麼問題? – Ben

+0

數組與對象不同。 '.push'是一個用於數組的函數(例如'[「this」,「is」,「an」,「array」]'),而不是對象。 – JCOC611

回答

5

FEtypes是一個對象,而不是一個數組。 Push僅適用於陣列。

如果你想這樣的結構存儲在數組中,它看起來是這樣的:

var FEtypes= [ 
     {type :"Text", size : 50, required : "no", FEadd :'<input>', label : 'Label', top : 0, left : 0}, 
     {type : "Textarea", cols : 30, rows : 5,FEadd :'<textarea>' } 
]; 

然後

FEtypes[1].left = someVariable1; 
FEtypes[1].top = someVariable2; 

如果要修改一次多個屬性,jQuery的extend功能會得到你想要的東西:

$.extend(FEtypes[1], {left:someVariable1, top:someVariable2}); 

但我認爲你的原始結構更合適。就在溝陣列,並做到這一點:

FEtypes.textareaTemplate.left = someVariable1; 
FEtypes.textareaTemplate.top = someVariable2; 

或者,還可以只用一行用jQuery:

$.extend(FEtypes.textareaTemplate, {left:someVariable1, top:someVariable2}); 
+0

'對象'實例和非'Array'實例沒有元素。他們只有屬性。 'var o = FEtypes [1]; o.left = someVariable1, o.top = someVariable2;'當然,但不推薦。您可以同樣使用分號而不是逗號;不太容易出錯。爲什麼只有一條線? – PointedEars

+0

謝謝。這工作,但它似乎已經消滅了陣列中的其餘項目。因此,而不是更新項目它只有這兩個元素。 – user1009749

+0

@ user1009749 - 查看我上次編輯 –

0

FEtypes指一個Array實例。因此,它沒有1屬性,而undefined,這是FEtypes[1]的結果根本沒有屬性。你的代碼不行,無法工作。檢查錯誤控制檯。

2

FEtypes是一個對象,它有兩個屬性textTemplatetextareaTemplate。它不是一個數組,並且沒有屬性[1]。因此,您不能使用.push()[1]

訪問.left.top參數或textareaTemplate屬性的正確方法是這樣的:

FETypes.textareaTemplate.left = someVariable1; 
FETypes.textareaTemplate.top = someVariable2; 

textTemplate,這將是這樣的:

FETypes.textTemplate.left = someVariable1; 
FETypes.textTemplate.top = someVariable2; 

無論是textareaTemplatetextTemplate性質是對象。如果你想更換整個對象(從而取代了對象的所有其他屬性),你可以這樣做:

FETypes.textTemplate = {left: someVariable1, top: someVariable1}; 

但是,這樣做的時候,你會更換整個textTemplate屬性,因此它會毫無除lefttop之外的其他特性。任何之前的屬性,例如sizerequired都將被新的分配消除。

如果你想只更新lefttop性能在原位留下別人,你必須分配給他們的個人 - 沒有捷徑,除非你寫一個函數來做到這一點是這樣的:

function updatePosition(obj, leftPos, topPos) { 
    obj.left = leftPos; 
    obj.top = topPos; 
} 

,然後調用像這樣的功能:

updatePosition(FETypes.textareaTemplate, someVariable1, someVariable2); 
0

嘗試這種使用lodash或下劃線:

_.chain(FEtypes).map(item => { 
     item.left = item.type === "Text" ? someVariable1 : item.left; 
     item.top = item.type === "Text" ? someVariable2 : item.top; 
     return item; 
    });