2016-05-17 5 views
0

Я настраиваю столбцы в угловом-UI-сетки, как это:Как создать динамический объект JSON в JavaScript

  $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 }); 

Но я не могу динамически определить атрибут в JSON, используя 'y' + taglist[i].getId() вместо этого он хочет фиксированное значение. Кто-нибудь знает аккуратный способ решить это?

+1

[Там нет такого понятия, как "JSON объект"] (http://benalman.com/news/2010/03/theres- no-such-thing-as-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 }); 

Вы можете использовать transpiler 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

Если я правильно понимаю вас, вы хотите динамически установить ключ в свой объект.

Вы можете сделать это следующим образом:

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

Несомненно, не проблема, вы выбираете, что вам лучше подходит. –

Смежные вопросы