2010-03-13 51 views
3

我有一個對象我試圖從另一個對象(也就是說,迭代返回對象來產生一個對象只有選定的值從原來的)。我的代碼如下所示:爲什麼我無法構建這個Javascript對象?

var collect = {}; 

function getHistoricalData(username){ 
$.getJSON("http://url/" + username + ".json?params", 
      function(data){ 
       for (var i=0; i < data.length; i++) { 
        console.log(i); 
        collect = { i : {text : data[i].text}}; 
        $("#wrap").append("<span>" + data[i].text + "</span><br />"); 

       }; 
       console.log(collect); 
      }); 

} 

所以我使用Firebug進行調試,這裏是我所知道的:

  • 的JSON對象是完整
  • console.log(i);是顯示數字1-20如預期
  • 當我在最後日誌collect對象,它的結構是這樣的: var collect = { i : {text : "the last iteration's text"}};

    所以增量值是「應用」到data [i] .text並返回文本值,但它沒有達到我的預期,這是創建collect對象的新成員;它只是覆蓋collect.i 20次,並留下最後一個值。

是否有需要用於分配對象成員的不同語法?我試過collect.i.text =collect[i].text =,錯誤是我試過的東西都是未定義的。

我很想知道這裏發生了什麼,所以更深入的解釋更好。

謝謝!

回答

2

你在對象中最終看到的只有一個屬性的原因是你不會在每次循環迭代中擴充它 - 你將覆蓋它。

collect = { i : {text : data[i].text}};

這是說:創建一個對象有一個屬性,i,其值是一個屬性,text另一個對象,並將其分配給變量collect。您想要做的是爲每個值i設置現有collect對象的屬性,其中i是屬性的名稱。

爲了創建一個動態設置名稱的對象屬性,您必須使用數組樣式語法,如下所示:collect[i]。我不認爲你可以像你嘗試過的那樣混合使用數組語法和對象字面語法。試試這個(免責聲明,未測試):如果你使用collect[i].text,因爲collect[i]分配之前不存在

collect[i] = { text: data[i]["text"] };

+0

這工作。解釋爲什麼更好的方式? – 2010-03-13 07:55:01

+0

編輯來解釋發生了什麼事。 :) – 2010-03-13 07:58:12

0
collect[i] = {text : data[i].text}; 

,它將返回undefined,它沒有text財產。

另外:

  1. collect.i意味着collect["i"]。這與collect[i]完全不同。
  2. 您可以使用數組並附加.push
0

正如你已經知道,問題是在這一行:

collect = { i : {text : data[i].text}}; 

循環的每次迭代,你擦除收集對象,並賦予它一個新的對象爲值。這就是爲什麼最後它只顯示最後一次迭代。

試試這個:

collect[i] = {text : data[i].text}; 
相關問題