2015-05-26 2 views
1

У меня есть данные с определенным правилом. Я хочу создать json-объект для управления этим правилом. Существует проблема с созданием json-объекта в качестве моей потребности. Здесь мои данные массива.Json Object push не работает, используя AngularJS

$scope.data = ["Crust^Pan^Medium=NA", "Crust^Pan^Large=NA", "Crust^Thin Crust^Medium=10.50"] 

Я хочу, чтобы выход, как это:

{ 
    "Pan": { 
      "Medium": NaN, 
      "Large": NaN, 
      }, 
    "Thin Crust": { 
      "Medium": 10.50 
      } 
    } 

Вот мой код,

$scope.crustRule = {}; 


    for(var i=0; i<$scope.data.length; i++) { 
     var tempCrust = {};       
     var trimOne = $scope.data[i].split('^'); 
     var trimTwo = trimOne[2].split('='); 
     if(trimOne[0] == 'Crust') { 
      tempCrust[trimTwo[0]]=parseFloat(trimTwo[1]); 
      $scope.crustRule[trimOne[1]].push(tempCrust); 
     } 
    } 
    console.log($scope.crustRule); 
+0

Вы получаете сообщение об ошибке? если не то, что вы получаете? и что вопрос имеет отношение к угловому? – Felix

+0

Я получаю сообщение об ошибке в моей консоли 'Can not read property 'push' of undefined' – Aniruth

+0

heh! что делает ответ довольно очевидным ... – Felix

ответ

1

Сначала необходимо создать объект $scope.crustRule[trimOne[1]], прежде чем вы можете поместить объекты в него. Что-то вроде

$scope.crustRule[trimOne[1]] = {}; 
$scope.crustRule[trimOne[1]].push(tempCrust); 
+0

метод push должен существовать только в массиве вроде объектов. но $ scope.crustRule [trimOne [1]] - пустой объект. [этот вопрос может помочь] (http: // stackoverflow.com/questions/29701114/mimic-the-structure-of-a-javascript-array-object/29742721 # 29742721) – Sarfaraaz

+0

снова ошибка печати в консоли '$ scope.crustRule [trimOne [1]]. push не является функцией' – Aniruth

+0

как @Sarfaraaz, толчок должен использоваться с массивами; не столько с объектами. вы можете определить '$ scope.crustRule [trimOne [1]]' как массивы или просто использовать назначение вместо push: '$ scope.crustRule [trimOne [1]] [trimTwo [0]] = parseFloat (trimTwo [1]) ' – Felix

1

Функция push должна существовать. вы можете захватить его из свойства Array, если хотите. сделать это, только если он должен быть в структуре объекта

var x = {length:0,push:Array.prototype.push}; 
x.push("jump"); 
console.log(x);//Object {0: "jump", length: 1} 

I go over the mininmum requirement for some array functions to work on an object:

Mimic the structure of a javascript array object

EDIT: Я заметил, ваши reuirements потребность объект без индекса длины и строки основанный вместо индекса числа. собираюсь испытать что-то

штопать Я надеялся, что-то дикое уже был там и пытался

var x = {}; 
x += {"BadGuy": "Joker"}; 
console.log(x)//[object Object][object Object] //:(

поэтому я сделал свою собственную нажимную функцию

var x = {push:ObjPush}; 
x.push("jump");//Object cannot add (string) yet Coming soon 
y = {"BadGuy": "Joker"}; 
x.push(y); 
console.log(x);//{"BadGuy": "Joker"}; 

function ObjPush(obj) 
{ 
    if ((typeof obj).toLowerCase() == "object") 
    { 
     for (var i in obj) 
     { 
      this[i] = obj[i]; 
     } 
    } 
    else 
    { 
     console.log("Object cannot add (" + typeof obj + ") yet\n Coming soon"); 
    } 
} 

Примечание: я гавань» t добавила какую-либо обработку для проверки того же свойства. поэтому любые свойства с таким же именем будут переопределить исходные свойства.

EDIT: Я интегрирован мой код с вашими и получил странный вывод, к сожалению. по какой-то причине вместо добавления средних и больших, как свойства для внутренних объектов, которые он только добавляет последний 1, например я получить выход

{"Pan":{"Large":null},"Thin Crust":{"Medium":10.5}} 

EDIT: OK Я нашел, где моя проблема была. Теперь я получаю ожидаемый результат. добавлена ​​проверка, чтобы убедиться, что $ scope.crustRule [trimOne [1]] инициализируется только в том случае, если он еще не существует.

if(typeof $scope.crustRule[trimOne[1]] == "undefined") 
    $scope.crustRule[trimOne[1]] = {push:ObjPush}; 
Смежные вопросы