2016-05-17 74 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

当然,没问题,你选择最适合你的东西。 –