2016-05-17 64 views
0

我設立在角UI格列如下:如何在JavaScript創建動態JSON對象

  $scope.columns.push({ 
       displayName: 'TimeStamp', field: 'x', width: $scope.setGridColumnWidth(), sort: { 
        direction: uiGridConstants.DESC, 
        priority: 1 
       } 
      }); 

      for (let i = 0; i < view.trend.getTagsList().length; i++) 
       $scope.columns.push({ displayName: view.trend.getTagsList()[i].getTitle(), field: 'y' + view.trend.getTagsList()[i].getId(), width: $scope.setGridColumnWidth() }); 

所以,如果一個趨勢包含2個標籤,我會得到一個UI網格與列{x, y{id0}, y{id1} }

現在我想要使用綁定數據:

  $scope.data = []; 
      let taglist = view.trend.getTagsList(); 

      for (let i = 0; i < taglist.length; i++) 
       for (let n of taglist[i].getData()) 
        $scope.data.push({ x: n.x, 'y' + taglist[i].getId(): n.y }); 

但我不能動態定義使用'y' + taglist[i].getId()而是想要一個固定值一個json的屬性。任何人都知道解決這個問題的方法很簡單嗎?

+1

[有作爲 「JSON對象」 沒有這樣的事(http://benalman.com/news/2010/03/theres- no-such-thing-a-json /) – adeneo

+0

就像邊節點一樣,你應該把'view.trend.getTagsList()'保存在一個變量中。 – jcubic

+0

@ adeneo相反,將鍵 - 值對的簡單對象稱爲「類JSON對象」很好且具有描述性。它肯定比「對象實例」或「鍵值對的集合」更簡潔。 –

回答

3

你想ES6's dynamic properties.

他們會允許你做這樣的事情

$scope.data.push({ x: n.x, ['y' + view.trend.getTagsList()[i].getId()]: n.y }); 

您可以使用ES6-ES5 transpiler實現這一目標。我看到你有這個標籤打字稿。從Typescript 1.5開始,編譯器會處理這個問題。對於那些卡在ES5上的人,請手動創建該對象。

let obj = { x: n.x }; 
obj['y' + view.trend.getTagsList()[i].getId()] = n.y; 
$scope.data.push(obj); 
1

如果我正確理解你,你想動態地在你的對象中設置一個鍵。

你能做到這一點,如下所示:

var y_final = 'y' + view.trend.getTagsList()[i].getId(); 
var obj = {}; 
obj[y_final] = n.y; 
obj[x] = n.x; 
$scope.data.push(obj); 
+0

謝謝你的回答,你是對的,但我會用@Paarth的答案去,因爲它最適合我的代碼。 –

1

您是否嘗試過第一次初始化對象?喜歡的東西...

var newObj = {"x": n.x}; 
eval ('newObj.y'+view.trend.getTagsList()[i].getId()+' = '+ n.y); 

一個簡單的測試在這裏:https://jsfiddle.net/544vso45/

+0

謝謝你的回答,你是對的,但我會用@Paarth的答案去,因爲它最適合我的代碼。 –

+1

當然,沒問題,你選擇最適合你的東西。 –