2016-01-06 4 views
0

У меня возникла проблема с тем, как изменить строку json внутри json-объекта для случайного числа объектов. Позвольте мне объяснить это дальше моим кодом и комментариями.Преобразование строки json в объект внутри случайного числа объектов JSON

У меня есть завод, который предоставляет объекты JSON

//Factory for products 
app.factory('productsFactory', ['$http', '$location', function($http, $location){ 
    var factory = {}; 
    factory.getlatestProductsList = function(n){ 
     return $http.get($location.protocol() + '://' + $location.host() + '/server/api/products/latest/'+n); 
    } 
    return factory; 
}]); 

Эта фабрика возвращает некоторое случайное число объектов

0: Object 
active: "1" 
alias: "baumbach-circle" 
date_c: "2016-01-06 08:09:54" 
date_u: null 
description: "Corrupti fugit iste quo sunt quidem voluptatibus dolorem. Eos velit architecto veritatis doloribus. Corporis sequi cupiditate possimus voluptates ut consequatur. Accusantium libero qui est sunt et." 
id_category: "46" 
id_product: "25" 
id_user: "177" 
images: "[{"thumbImage":"http:\/\/lorempixel.com\/250\/150\/?63763","image":"http:\/\/lorempixel.com\/1024\/768\/?52630","position":0},{"thumbImage":"http:\/\/lorempixel.com\/250\/150\/?99795","image":"http:\/\/lorempixel.com\/1024\/768\/?84669","position":1},{"thumbImage":"http:\/\/lorempixel.com\/250\/150\/?17506","image":"http:\/\/lorempixel.com\/1024\/768\/?88926","position":2},{"thumbImage":"http:\/\/lorempixel.com\/250\/150\/?73869","image":"http:\/\/lorempixel.com\/1024\/768\/?91917","position":3},{"thumbImage":"http:\/\/lorempixel.com\/250\/150\/?70019","image":"http:\/\/lorempixel.com\/1024\/768\/?18509","position":4}]" 
name: "Baumbach Circle" 
__proto__: Object 
1: Object 
active: "1" 
alias: "elta-road" 
date_c: "2016-01-06 08:09:53" 
date_u: null 
description: "Culpa perferendis dolores rerum deleniti vero cumque. Similique explicabo beatae est quo sit nisi. Et a voluptatem nihil in. Voluptates modi qui est ducimus corrupti." 
id_category: "46" 
id_product: "24" 
id_user: "73" 
images: "[{"thumbImage":"http:\/\/lorempixel.com\/250\/150\/?53746","image":"http:\/\/lorempixel.com\/1024\/768\/?49502","position":0},{"thumbImage":"http:\/\/lorempixel.com\/250\/150\/?75052","image":"http:\/\/lorempixel.com\/1024\/768\/?77727","position":1},{"thumbImage":"http:\/\/lorempixel.com\/250\/150\/?32463","image":"http:\/\/lorempixel.com\/1024\/768\/?76121","position":2},{"thumbImage":"http:\/\/lorempixel.com\/250\/150\/?61377","image":"http:\/\/lorempixel.com\/1024\/768\/?89434","position":3},{"thumbImage":"http:\/\/lorempixel.com\/250\/150\/?86873","image":"http:\/\/lorempixel.com\/1024\/768\/?82513","position":4}]" 
name: "Elta Road" 
__proto__: Object 

Проблема заключается в том, что изображения в формате JSON в виде строки, так что я должен использовать JSON .parse (по крайней мере, я так думаю, так как я новичок в этом), чтобы преобразовать их в JSON

Мой вопрос: есть ли простой хороший способ разобрать все данные изображений на json или мне нужно сделать это с помощью forEach, и если да, то как бы выглядел код. Я не достиг этого эффекта на фабрике, поэтому мне не нужно повторять код в каждом контроллере, который звонит на эту фабрику.

Если вам нужна дополнительная информация, сообщите мне, и я предоставлю. Заранее спасибо.

+0

"* как бы выглядел код *" - на что вы застряли? Похоже, вы знаете, как использовать JSON.parse и как использовать forEach; вы в основном звучите так, как будто все готово, так как это не должно быть сложным. Я не обвиняю вас в том, что вы ленитесь, чтобы опубликовать это как вопрос, я просто искренне не знаю, с чем вам нужна помощь. РЕДАКТИРОВАТЬ: Поцарапайте это, забыли асинхронную/затем часть, которая, безусловно, может затмевать чье-то мышление. – Katana314

ответ

1

вы можете изменить ответ, возвращаемый за $ HTTP перед возвращением его

app.factory('productsFactory', ['$http', '$location', function($http, $location){ 
    var factory = {}; 
    factory.getlatestProductsList = function(n){ 
     var url = $location.protocol() + '://' + $location.host() + '/server/api/products/latest/'+n; 
     return $http({ 
      method: 'GET', 
      url: url 
     }).then(function successCallback(response) { 
      // you can edit the response her, and parse it 
      return response ; 
     }, function errorCallback(response) { 

     }); 
    } 
    return factory; 
}]); 
+0

Да, это то, как я думал, как это сделать, но я надеялся на какое-то более плавное решение вместо того, чтобы писать целые forhach shenanigans. Так что в основном я ищу те строки ответа редактирования –

0

Вы можете использовать тот факт, что $ http возвращает обещание, а затем выполняет некоторую обработку данных перед возвратом обещания. Имеет ли эта работа для вас - дайте мне знать, нужно ли вам в ES5

factory.getlatestProductsList = function(n){ 
    return $http.get($location.protocol() + '://' + $location.host() + '/server/api/products/latest/'+n) 
    .then(data => data.map(elem => { 
     var tmp = Json.parse(elem.images); 
     elem.images = tmp 
     return elem; 
    })); 

в ES5

factory.getlatestProductsList = function(n){ 
    return $http.get($location.protocol() + '://' + $location.host() + '/server/api/products/latest/'+n) 
    .then(function(data) { 
     return data.map(function(elem) { 
     var tmp = Json.parse(elem.images); 
     elem.images = tmp 
     return elem; 
     }); 
    }); 
+0

Выглядит хорошо, но я думаю, что он попросил сделать это на заводе, а не на каждом звонке. Учитывая, что это также просто изменение, а не преобразование, вы можете сделать это с помощью forEach, а не с картой. – Katana314

+0

Я никогда не вижу использования '=>' в javascript. как это называется, пожалуйста? – AlainIb

+0

это «жирная стрелка» ES2015 и является сокращением для анонимного вызова функции –

0

Вставка кода, если кто-то хочет посмотреть, как это выглядит

//Factory for products 
app.factory('productsFactory', ['$http', '$location', function($http, $location){ 
    var factory = {}; 
    factory.getlatestProductsList = function(n){ 
     var url = $location.protocol() + '://' + $location.host() + '/server/api/products/latest/'+n; 
     return $http({ 
      method: 'GET', 
      url: url 
     }).then(function successCallback(response) { 
      var pros = response.data; 
      pros.forEach(function(item){ 
       var pictures = JSON.parse(item.images); 
       delete item.images; 
       item.images = pictures; 
      }) 
      return pros; 
     },function errorCallback(response) { 
      console.log('error fetching latest products: ' + response); 
     }); 
    } 
    return factory; 
}]); 
Смежные вопросы