2014-06-11 84 views
1

我嘗試以特定方式元素添加到下面的JSON元素添加到一個JSON的一部分:我如何通過使用jQuery

var data = [{"name":"google", 
      "ip":"10.10.10.01", 
      "markets":[{"name":"spain","county":"6002,6017,6018,6019,6020"}, 
         {"name":"france","county":"6003,6005,6006,6007,6008,6025,6026,6027,6028,6029"}, 
         {"name":"japan","county":"6004,6021,6022,6023,6024"}, 
         {"name":"korea","county":"6000,6013,6014,6015,6016"}, 
         {"name":"vietnam","county":"6001,6009,6010,6011,6012"}]}, 
      {"name":"amazon", 
      "ip":"10.10.10.02", 
      "markets":[{"name":"usa","county":"10000,10001,10002,10003,10004,10005"}]}, 
      {"name":"yahoo", 
      "ip":"10.10.10.03", 
      "markets":[{"name":"japan","county":"10000"}]}]; 

我想這個元素添加到JSON:

newData = [{"name":"amazon", 
      "ip":"10.10.10.02", 
      "markets":[{"name":"mexico","county":"9000"}]}]; 

結果可能是正是這一點:

var data = [{"name":"google", 
      "ip":"10.10.10.01", 
      "markets":[{"name":"spain","county":"6002,6017,6018,6019,6020"}, 
         {"name":"france","county":"6003,6005,6006,6007,6008,6025,6026,6027,6028,6029"}, 
         {"name":"japan","county":"6004,6021,6022,6023,6024"}, 
         {"name":"korea","county":"6000,6013,6014,6015,6016"}, 
        {"name":"vietnam","county":"6001,6009,6010,6011,6012"}]}, 
      {"name":"amazon", 
      "ip":"10.10.10.02", 
      "markets":[{"name":"usa","county":"10000,10001,10002,10003,10004,10005"}, 
         {"name":"mexico","county":"9000"}]}, 
      {"name":"yahoo", 
      "ip":"10.10.10.03", 
      "markets":[{"name":"japan","county":"10000"}]}]; 

我試着使用:

$.extend(data.markets, newData) 

$.extend(true, data, newData); //這隻適用於每個元素都是新的情況。

但沒有任何工作,我假裝的方式。

任何人都可以給我一個解決方案嗎?

在此先感謝。

+1

FYI,你發佈的是一個包含對象,而不是JSON的JavaScript數組。 '.extend(data.markets,newData)'不起作用,因爲'data'是一個數組,並且數組沒有'markets'屬性。 '.extend(true,data,newData)'不起作用,因爲'data'是一個數組,並且你正試圖向數組添加屬性'name','ip'和'markets'沒有意義。你實際上必須做的是遍歷'data'來找到名稱和ip匹配的對象,併合並它們的'''''''數組。 –

+0

是的,奇怪的JavaScript對象表示法並不是指用於表示JavaScript對象的符號... – Jeff

回答

2

您還沒有創建JSON,你已經創建了一個JavaScript的文本對象。

您可以通過

data[1].markets.push({"name":"mexico","county":"9000"}) 

添加newdata的這件特定的因爲你是在處理JavaScript對象,你可以寫一個函數來檢查數據[n]和push數據的存在。

+0

非常感謝,按我的方式工作。 – Dan

2

你有對象的數組,每個對象是這樣的:

var item = {"name":"...", 
      "ip":"...", 
      "markets":[ /*some objects here*/]; 
} 

那麼爲什麼不直接創建自定義的方法來插入元素?它可以在陣列中搜索時,如果使用相同的名稱和ip的項目存在,然後:

  • 如果它確實存在:市場追加到現有項目的市場屬性(也許你需要的,如果他們已經再次檢查存在)。 UPDATE:@jasonscript在his answer中添加的代碼將完成這項工作:一旦您找到了添加市場的地方,只需將其添加到數組中即可。再一次,也許你必須檢查這個市場是否已經在陣列中。使用jQuery這將是:$.extend(true, data[i],newData)
  • 如果不存在的話:只要項添加到陣列:$.extend(true, data,newData)
+0

是的,問題是我不知道如何實現第一種情況(將市場附加到現有的項目市場屬性) 。第二種情況是$ .extend(true,data,newData),它完美地工作 – Dan

+0

$ .extend只是合併兩個對象,所以對於第一種情況,你可以寫$ .extend(true,data [i],newData) ,'i'是已存在項目的索引 –

0

another answer一些代碼:

$.each(data, function(item){ 
    if(item.name == newData[0].name && item.ip == newData[0].ip) { 
     item.markets.push.apply(item.markets, newData[0].markets); 
    } 
} 

這是假設你知道,在新對象中所有市場項目到現有的不同 - 否則,你必須做一個嵌套的foreach或一些東西。如果你可以稍微改變對象的符號,你可以考慮using a dictionary-like object for Markets以使它更清潔。

事實上,將data從關聯數組更改爲可能也適用於此。然後你可以很容易地檢查存在與:

if(data[myNewDataName]){ 
    //add to markets 
} else { 
    data[myNewDataName] = myNewData; 
}