如何在javascript中创建动态json对象

时间:2016-05-17 09:43:51

标签: javascript json typescript angular-ui-grid

我正在设置angular-ui-grid中的列,如下所示:

            $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个标记,我将获得包含{x, y{id0}, y{id1} }列的ui网格。

现在我尝试使用以下方法绑定数据:

            $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中动态定义属性,而是需要固定值。有谁知道解决这个问题的巧妙方法?

3 个答案:

答案 0 :(得分:3)

您需要ES6's dynamic properties.

他们会允许你做这样的事情

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

您可以使用ES6-ES5转换程序来实现此目的。我看到你用打字稿标记了这个标签。从Typescript 1.5开始,编译器将处理此问题。对于那些卡在ES5上的人,请手动创建对象。

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

答案 1 :(得分: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);

答案 2 :(得分:1)

您是否尝试过初始化对象?有点像...

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

这里有一个简单的测试:https://jsfiddle.net/544vso45/