从多个getJSON响应中返回对象

时间:2016-03-22 23:34:03

标签: javascript json

我有一个调用分页API的函数,循环遍历每个页面并从每个响应中返回数据:

function nextPage(url) {
    if (!url) {
        return;
    }
    $.getJSON(url, function(data) {
        nextPage(data.next);
        $.each(data.results, function (k, v) {
            console.log(v.city_name);
        });
    });
}

nextPage('http://url.com/api/v1/cities/?page=1');

目前,当我将响应记录到控制台时,我得到的内容如下:

Paris
Brussels
Mexico City
...

但我想要的是一个看起来像这样的结构:

[
  {item: 'Paris'},
  {item: 'Brussels'},
  {item: 'Mexico City'}
]

作为参考,响应数据如下所示:

{
    "count": 105,
    "next": "http://url.com/api/v1/cities/?page=2",
    "previous": null,
    "results": [
        {
            "city_detail": "http://url.com/api/v1/cities/1/",
            "city_name": "Paris"
        },
        {
            "city_detail": "http://url.com/api/v1/cities/2/",
            "city_name": "Brussels"
        },
        {
            "city_detail": "http://url.com/api/v1/cities/3/",
            "city_name": "Mexico City"
        }
    ]
}

我知道答案是盯着我,可能很简单,但我缺乏javascript知识让我失望。希望有助于解决这个问题。谢谢!

修改

问题似乎是nextPage函数进行多次调用,从JSON的每个页面返回数据。我可以将这些数据转换为多个对象,但不能将一个对象表示为所有响应。

2 个答案:

答案 0 :(得分:2)

所以基本上你想把key:value对存储到一个对象..:

点符号:

var cities = {}
function nextPage(url) {
    if (!url) {
        return;
    }
    $.getJSON(url, function(data) {
        nextPage(data.next);
        $.each(data.results, function (k, v) {
            console.log(v.city_name);
            cities.name = v.city_name  //Push to an object
        });
    });
}

所以你会得到这个回复:

cities = [
  {city: 'Paris'},
  {city: 'Brussels'},
  {city: 'Mexico City'}
]

括号表示法:

var cities = {}
function nextPage(url) {
    if (!url) {
        return;
    }
    $.getJSON(url, function(data) {
        nextPage(data.next);
        $.each(data.results, function (k, v) {
            console.log(v.city_name);
            cities["name"]= v.city_name  //Push to an object
        });
    });
}

结果

: (两者相同)

cities = [
  {city: 'Paris'},
  {city: 'Brussels'},
  {city: 'Mexico City'}
]

修改

好的,还有另外一个问题!这是鬼鬼祟祟但我们最终抓住了它。问题出在这里:

$.getJSON(url, function(data) {
  console.log(data.results)
    nextPage(data.next);
    $.each(data, function (k, v) {
        cities["title"]= v.title  //Push to an object
    });
});

现在,你看到它说data.results ...实际上data.results是一个空的未定义变量。你应该做的只是包含整个数据的数据。您可能现在不理解它,但查看下面代表的代码......

var dataJSON;
function nextPage(url) {
    if (!url) {
        return;
    }
    $.getJSON(url, function(data) {
      console.log(data) //This consits the data on the below provided url...
        dataJSON = data; // Just making a public variable assigned to the data..
        nextPage(data.next);
        $.each(data, function (k, v) {
        });
    });
}

nextPage('https://cdn.rawgit.com/amanuel2/Collabs/master/list.json')

Plunker 转到控制台查看数据....

<强> EDIT2

好的,这比你放入GITHUB的JSON文件好多了,所以我有一个安全的HTTPS:// .. Anways here我刚刚做了data.results,我得到了这个结果:

enter image description here

这是 Plunker !希望这有帮助!!

EDIT3

好了,现在这是最后一点..你的第二个JSON页面..你的第二个JSON页面实际上有语法错误..所以我修复了那些把它放在github并上传了新的JSON ..这里是{{3 }} ..

plunker 关于对象..

答案 1 :(得分:0)

var results = []
function nextPage(url) {
    if (!url) {
        return;
    }
    $.getJSON(url, function(data) {
        nextPage(data.next);
        $.each(data.results, function (k, v) {
            results.push({item: v.city_name})
            console.log(v.city_name);
        });
    });
}
console.log(results) 
// should show an array with {item: city_name} objects.

这允许在外部作用域中访问results数组。