2011-12-31 56 views
2

我有一個通過AJAX通過AJAX從服務器創建的對象。該對象有幾個子對象的數組,例如:需要時動態創建子對象和數組

obj.subObj1[0].value="abc"; 
obj.subObj1[1].value="abc"; 
obj.subObj2[0].value="abc"; 

現在我想在這種對象設置一些值,但我不知道他們是否已經存在。

obj.subObj1[0].value="new Value"; // No Problem 
obj.subObj2[1].value="new Value2"; // Problem because obj.subObj2[1] is no Object. 

我需要做的第一obj.subObj2[1]={}

因爲我經常遇到這個問題,所以我正在尋找使這個自動化的方法。一種方法或類,它會自動創建所需的對象(如果我使用整數,則爲數組)。

它應該能夠處理這種子對象的無限深度。像這樣:

var obj = TheObject(); 
obj.sub1.sub2[10].sub3[1].sub4='value'; 

現在自動創建所有需要的子對象和數組。

回答

1

真的不能保證有關跨瀏覽器兼容任何東西,但如何在嘗試這種尺寸爲(在Chrome作品):

// Safely sets value property of index of an array of an object. 
function setObj(obj, subObjName, index, val) { 
    // Ensure the object exists 
    if (typeof obj == 'undefined') { 
     obj = new Object(); 
    } 

    // Ensure the array property exists 
    if (typeof obj[subObjName] == 'undefined') { 
     obj[subObjName] = new Array(); 
    } 

    // Ensure the array properties index exists 
    if (typeof obj[subObjName][index] == 'undefined') { 
     obj[subObjName][index] = {}; 
    } 

    // Set the value 
    obj[subObjName][index].value = val; 

    // Return the object 
    return obj; 
} 

使用例:

<script type="text/javascript"> 
    var obj; 
    obj = setObj(obj, "something", 1, "val"); 
    setObj(obj, "something", 0, "someValue"); 
    alert(obj.something[1].value); 
    alert(obj.something[0].value); 
</script> 
+0

+1 nice answer :) – Marwan 2011-12-31 11:22:08

+0

這適用於極限示例。我正在尋找一個通用的解決方案,用於對象中的無限深度。我也想做 obj.some [0] .other [1] .another.value 等等。 – 2011-12-31 12:56:16

+0

這實際上並不是你問的,但你可以稍微改變你的問題以反映這一點。爲了做這樣的事情,我會想象你需要一個字符串解析函數來自動創建適當的對象和數組變量。結果調用看起來像這樣:parentObject = createBlueSmoke(「obj.some [0]。其他[1] .another.value「,」某個值「); – abelito 2011-12-31 13:14:56

0

如果可以假設數組中的被引用的項目將會是未定義的,或者它是簡化事物的對象。當然,簡單(非自動)的方法是這樣的:

if (!obj.subObj2[1]) obj.subObj2[1] = {}; 
obj.subObj2[1].value = "new Value2"; 

一個不是非常通用的函數來爲你做它應該是:

function setArrayObjectProp(arr, index, prop, val) { 
    if (!arr[index]) 
     arr[index] = {}; 

    arr[index][prop] = val; 
} 

// called as 
setArrayObjectProp(obj.subObj2, 1, "value", "new Value2"); 
0

heloo

試首先測試數組項目的類型,如果它不是對象然後等於它新的對象格式{value:「new Value2」}

if(typeof(obj.subObj2[1])!='object') 
{ 
obj.subObj2[1] = {value:"new Value2"}; 
} 
else 
{ 
obj.subObj2[1].value = "new Value2"; 
}