2017-02-28 78 views
1

我知道有一些類似的問題,但其中的非不由我與我的問題:更新JavaScript對象

我有一個對象:

var mapOptions = { 
     legend: { 
      data:[ 
       {name: 'Europe', backgroundColor: 'RGB(228,101,41)'}, 
       {name: 'APAC', backgroundColor: 'RGB(0,71,126)'}, 
       {name: 'MENEAT', backgroundColor: 'RGB(145,0,73)'} 
      ], 
     } 
    } 

這個對象應該通過這個對象進行更新:

var newOptions = { 
      legend: { 
      data: [ 
       {name: 'Europe', backgroundColor: 'green'}, 
      ] 
      } 
    } 

應該更新功能能夠做什麼:

  1. 更新屬性:從'RGB(228,101,41)''green'

  2. 刪除不需要的物品:如只有'Europe'項應該保留。

現在我用的是jQuery extend/deep功能:

$.extend(true, mapOptions, newOptions); 

它的工作原理部分。只有屬性被更新。

任何人都可以幫助我實現第二點,如何刪除/添加項目?

還是應該把它分成兩個函數更好?

謝謝你的幫助!

+0

'更新的屬性:從 'RGB(228,101,41)' 到「green''不是所有的RGB值有英文名字。在這種情況下你想做什麼? – mehulmpt

+0

@MehulMohan指出第一個問題。第二個問題,基於你想要刪除一個項目?你只想保留'歐洲'?如果有多次'歐洲'會怎麼樣? – Weedoze

+0

1.問題:只是一個例子。我將使用RGBs代替:) –

回答

1

,該解決方案可能是一個基本的任務:

mapOptions.legend.data = newOptions.legend.data 
+0

問題是此對象中存在多個「數據」屬性。看起來每個人都必須以基本的分配爲基礎。感謝幫助 –

1

如果你只想改變第一valeus 你可以使用相對索引位置(0)的數據數組內

mapOptions.legend.data[0] = {name: 'Europe', backgroundColor: 'green'}; 

如果你想改變所有的數據contente,那麼你可以使用JavaScript點符號訪問基於您的示例對象元素

mapOptions.legend.data = {name: 'Europe', backgroundColor: 'green'}; 
+1

@RoryMcCrossan謝謝回答擴展完整更改 – scaisEdge

0

試試這個

mapOptions.legend.data = {name: 'Europe', backgroundColor: 'green'}; 
0

對多個項目進行更新,你可以使用一個哈希表的對象的引用,然後迭代更新陣列。

如果爲給定名稱設置了hash,則更新,否則將新對象推送到該數組。

var mapOptions = { legend: { data: [{ name: 'Europe', backgroundColor: 'RGB(228,101,41)' }, { name: 'APAC', backgroundColor: 'RGB(0,71,126)' }, { name: 'MENEAT', backgroundColor: 'RGB(145,0,73)' }], } }, 
 
    newOptions = { legend: { data: [{ name: 'Europe', backgroundColor: 'green' }, ] } }, 
 
    hash = Object.create(null); 
 

 
mapOptions.legend.data.forEach(function (a, i) { 
 
    hash[a.name] = a; 
 
}); 
 

 
newOptions.legend.data.forEach(function (a) { 
 
    if (hash[a.name]) { 
 
     hash[a.name].backgroundColor = a.backgroundColor; 
 
    } else { 
 
     mapOptions.legend.data.push(a); 
 
    } 
 
}); 
 

 
console.log(mapOptions.legend.data);
.as-console-wrapper { max-height: 100% !important; top: 0; }