Get function in service.js returns null

0

I have a Json of categories with an array of products inside it. Search all categories and all products according to category, you are looking for. Now the problem is that I want to return the detail of the product by product id, but in the console it is returning null .

Json

.factory('Categorias', function() {

 var categorias = [
 {//Nova Categoria
    "idCategoria": 1,
    "nomeCategoria": "categoria 1",
    "produtos": [
       {//Novo Produto
          "idProduto": 1,
          "nomeProduto": "produto 01A",
       },
       {//Novo Produto
          "idProduto": 2,
          "nomeProduto": "produto 02A",
       }
    ]
 }
];

return {
all: function() {
  return categorias;
},
get: function(categoriaId) {
  for (var i = 0; i < categorias.length; i++) {
    if (categorias[i].idCategoria === parseInt(categoriaId)) {
      return categorias[i];
    }
  }
  return null;
},
 getProduto: function(produtoId) {
 for (var i = 0; i < categorias.length; i++) {
  if (categorias[i].idProduto === parseInt(produtoId)) {
     return categorias[i];
  }
 }
 return null;
}
};
});

Controller

.controller('ProdutoDetalheCtrl', function($scope, $stateParams, Categorias) {
  $scope.produtosCategoria = Categorias.getProduto($stateParams.produtoId)
  console.log($stateParams.produtoId);
  console.log($scope.produtosCategoria)
})

Console

1
null
    
asked by anonymous 02.03.2016 / 17:51

3 answers

2

As you have already replied you need two For's one to go through categories and another to go through the products.

Alternatively, you can use angular.ForEach() to go through your arrays :

var myApp = angular.module('myApp', []);

myApp.factory('Categorias', function() {
  
    var categorias = [{
        "idCategoria": 1,
        "nomeCategoria": "categoria 1",
        "produtos": [{ 
            "idProduto": 1,
            "nomeProduto": "produto 01A",
        }, { 
            "idProduto": 2,
            "nomeProduto": "produto 02A",
        }]
    }];

    return {
   
        getProduto: function(produtoId) {
            var produto = {};
            angular.forEach(categorias, function(categoriaCorrente) {
                angular.forEach(categoriaCorrente.produtos, function(produtoCorrente) {
                    if (produtoCorrente.idProduto === parseInt(produtoId)) {
                        produto = produtoCorrente;
                    }
                })
            })
            return produto;
        }
    };

});

function MyCtrl($scope, Categorias) {
    $scope.produtosCategoria = Categorias.getProduto(1)
    console.log(1);
    console.log($scope.produtosCategoria)
    console.log("ID: ",$scope.produtosCategoria.idProduto)
    console.log("Nome: ",$scope.produtosCategoria.nomeProduto)
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script><divng-app="myApp" ng-controller="MyCtrl">
ID Produto: <b>{{produtosCategoria.idProduto}}</b>
 </br>
Nome Produto: <b>{{produtosCategoria.nomeProduto}}</b>
</div>

If you prefer, you can use the EcmaScript forEach , Example:

 lista.forEach(function(item){
    console.log(item)
  })
    
02.03.2016 / 18:55
1

Following its logic, the getProduto function should be like this

getProduto: function(produtoId) {
 for (var i = 0; i < categorias.length; i++){
     for(var c = 0; c < categorias[i].produtos.length; c++){  
         if (categorias[i].produtos[c].idProduto === parseInt(produtoId)) {
             return categorias[i].produtos[c];
         }
     }
 }
 return null;
}
    
02.03.2016 / 18:40
1

The "Product [i] .id categories" that you use to compare to "productId" does not exist. What exists is the "categories [i] .products [and]. Product".

So its function had to be something like this:

for (var i = 0; i < categorias.length; i++) {
   for (var y = 0; i < categorias[i].produtos.length; y++) {
      if (categorias[i].produtos[y].idProduto === produtoId) {
          return categorias[i].produtos[y];
      }
   }
}
    
02.03.2016 / 18:35