Объединение нескольких объектов для создания объекта JSON в Node - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь создать свой собственный объект JSON из нескольких онлайн-источников изображений / фотографий.Приведенный ниже код должен объяснить, что я пытаюсь выполнить:

var searchUnsplash = require('./apis/unsplash');
var searchFlickr = require('./apis/flickr');

function combineObjs(callback) {

    var obj = {} 
    var key = 'item';
    obj[key] = []; 

    searchFlickr.searchFlickr(searchTerm, searchCount, searchPage,
        function (callback) { // each API call is in a separate file with these functions exported 

            obj[key].push(flickrObj); // this does not work 
            // console.log(flickrObj) // this works 
        });
    searchUnsplash.searchUnsplash(searchTerm, searchCount, searchPage, 
        function (callback) {

            obj[key].push(unsplashObj);
            // console.log(unsplashObj)
        });

    console.log(obj)
}

combineObjs();

Цель состоит в том, чтобы в итоге получить объект JSON, как показано ниже:

["item": {
    "id": 1,
    "title": 2,
    "content": 3,
    "source": "flickr"
}, 
"item": {
    "id": 1,
    "title": 2,
    "content": 3,
    "source": "unsplash"
}]

и т. Д., Который я могу использовать дляВласть мой передний конец.

Я новичок в javascript, и я просто работаю над тем, чему научился в уроках и статьях, так что, возможно, я полностью использую неправильный подход для достижения моих целей.Рад взять любые указатели

функция поиска:

function searchUnsplash(term, count, page, callback) {
    request(`https://api.unsplash.com/search/photos/?per_page=${count}&page=${page}&query="${term}"&client_id=KEY&`, 

    function searchResult(error, response, body) {
        if (!error && response.statusCode == 200) {
        var info = JSON.parse(body)

        for ( var i = 0; i < info.results.length; i++) {

            obj = {
                id: `us-${info.results[i].id}`, 

            }
            callback(obj);

        }

    }

    })
}

module.exports.searchUnsplash = searchUnsplash;

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Во-первых, ваш намеченный результат неверен.Вы не можете назвать "item" отдельные записи массива.Вот исправленный и рабочий пример:

[ {
    "id": 1,
    "title": 2,
    "content": 3,
    "source": "flickr"
}, 
{
    "id": 1,
    "title": 2,
    "content": 3,
    "source": "unsplash"
}]

Во-вторых, вы ошибочно принимаете JSON за структуру данных.JSON - это просто текстовая нотация.Итак, давайте сначала посмотрим, как построить подходящий массив данных.

let results = [];
results.push( { id:1, title:2, content:3, source:"flickr" });
results.push( { id:2, title:4, content:6, source:"unsplash" });

А затем с помощью JSON.stringify(results) кодируем ваш results в JSON.

Наконец, вы смешиваете асинхронныйвызовы в вашем коде с синхронными вызовами.Вам необходимо сохранить результаты обратного вызова отдельных функций, то есть когда вы действительно получите ответы асинхронно.Кроме того, вам нужно подсчитать ожидающие результаты и вызвать окончательный обратный вызов, когда все будет сделано.

Итак, собрав все части вместе, в надуманном фальшивом примере, мы просто дважды вызываем функции поиска и поэтому делаем обратный вызов, когдадва результата объединены.

function combineObjs(callback) {  
   let results = [];   
   function partialResult(obj) { 
     results.push(obj); 
     if (results.length=2) callback(results);
   }; 
   searchFlickr(searchTerm, searchCount, searchPage, partialResult);
   searchUnsplash(searchTerm, searchCount, searchPage,partialResult);    
}

combineObjs( function(results) { console.log(JSON.stringify(results)) });
0 голосов
/ 03 июня 2018

Это чрезмерно, но это будет работать.Его можно использовать снова и снова и снова.: D

Запустите фрагмент, чтобы увидеть результат

class JSONBuilder
{
  constructor(contents=null)
  {
    if(!contents)
    {
      //Private objecy hash that isn't publicly accessible
      var objectHash = {};
      
      //Get stashed item
      this.GetItem = function(key)
      {
        if(!key) throw new Error("Null or Underfined Key Passed.");

        let value = objectHash[key];
        if(!value) throw new Error(`Key : ${key} Not Found in JSON objectHash`);
        return value;
      }
      
      //Set an item in the objecy hash
      this.SetItem = function(key, value)
      {
        if(!key) throw new Error("Null or Underfined Key Passed.");
        if(!value) throw new Error("Null or Underfined Key Not Found.");

        objectHash[key] = value;
      }
      
      //Remove item from the hash
      this.DeleteItem = function(key)
      {
        if(!key) throw new Error("Null or Underfined Key Passed.");
        if(!objectHash[key]) throw new Error(`Key : ${key} Not Found in JSON objectHash`);

        objectHash.DeleteItem(key);
      }
      
      //Turn items into a JSON object
      this.Build = function()
      {
        return JSON.stringify(objectHash);
      }
    }
    else
    {
      //If a string is passed as a paremeter, reconstruct from that
      try
      {
        objectHash = JSON.parse(contents);
      }
      catch(Err)
      {
        console.log("Parsing of JSON Content Failed.");
        throw Err;
      }
    }
  }
}

class Item
{
  constructor(id, source, content, title)
  {
    this.Id = id;
    this.Source = source;
    this.Content = content;
    this.Title = title;
  }
}
let builder = new JSONBuilder();
let itemContainer = [];
itemContainer.push(new Item(1, 'flicker', 'stuff', 'item1'));
itemContainer.push(new Item(2, 'flicker', 'morestuff', 'item2'));

builder.SetItem('items', itemContainer);
console.log(builder.Build());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...