【问题标题】:Organizing a JSON result with jQuery使用 jQuery 组织 JSON 结果
【发布时间】:2013-05-24 22:48:46
【问题描述】:

我有一个如下所示的 JSON 对象:

data=[{"name":"John Smith",
       "favorites":{"color":"orange",
                    "city":"Paris"}},
      {"name":"Jane Baker",
       "favorites":{"color":"red",
                    "city":"San Francisco"}},
      {"name":"Tommy Jones",
       "favorites":{"color":"blue",
                    "city":"Paris"}}]

我想用 jQuery 浏览这些结果,并重组每个人进入最喜欢的城市对象的数据(如果它是唯一的,则创建一个新对象,如果不是,则将其放入现有对象)。像这样……

data=[
    {"city":"Paris",
        {{"name":"John Smith",
          "color":"orange"},
         {"name":"Tommy Jones",
          "color":"blue"}}
    },
    {"city":"San Francisco",
        {{"name":"Jane Baker",
          "color":"red"}}
    }]

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您预期的 data 不是有效的 JavaScript,除此之外您到目前为止尝试过什么?
  • 我删除了 data 以避免混淆......它在那里推断它来自 $.ajax 调用。我还没有走得太远,因为我还没有找到如何检测城市键中的值是否存在。

标签: jquery json sorting object


【解决方案1】:

我会这样做:

var newData = [], tempData = {};

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

  // Extract all the information we need.
  var person = data[i],
      cityName = person.favorites.city,
      personObj = {name: person.name, color: person.favorites.color };

  if (tempData[cityName]) {
    tempData[cityName].people.push(personObj); 
  } else {
    tempData[cityName] = { people: [personObj] };
  }
}

// Sort the data into the required format
for (var city in tempData) {
  var people = tempData[city].people;
  newData.push({ city: city, people: people });
}

【讨论】:

  • 要去试一试! 谢谢。我会告诉你的!
  • 由于某种原因,此循环无法识别现有城市名称。 goo.gl/t9liC
  • 这很奇怪。我去看看。
  • 已更新。现在应该可以正确排序了。
  • 确实如此!谢谢你,罗斯。
【解决方案2】:

此方法产生以下对象

{"Paris":[
    {"name":"John Smith","color":"orange"},
    {"name":"Tommy Jones","color":"blue"}],
"San Francisco":[
    {"name":"Jane Baker","color":"red"}]
}

这里是代码

var data=[{"name":"John Smith","favorites":{"color":"orange","city":"Paris"}},
{"name":"Jane Baker","favorites":{"color":"red","city":"San Francisco"}},
{"name":"Tommy Jones","favorites":{"color":"blue","city":"Paris"}}];

var cityData = {};

data.map(function(person){
    if(person.favorites.city in cityData) {
        cityData[person.favorites.city].push(
            {
                "name" : person.name,
                "color" : person.favorites.color
            }
        );
    } else {
        cityData[person.favorites.city] = 
            [{
                "name" : person.name,
                "color" : person.favorites.color
            }];
    }
}, cityData);

console.log(cityData);
console.log(JSON.stringify(cityData));

【讨论】:

    【解决方案3】:

    使用出色的 underscore.js 库(它的微型库,只有 4 kB,并提供了许多对 javascript 的强制性有用补充)。

    其次,你说你需要以下输出:

    { "city":"Paris",
        {{"name":"John Smith","color":"orange"},
         {"name":"Tommy Jones","color":"blue"}}
    }
    

    这在语法上是错误的。人是一个对象数组,应该表示为[{ "name" : ... }]not {{ "name" : }}。在"city" : "Paris"之后,你必须有一把钥匙给人民,它不能在城市之后以{{开头。所以你的输出应该是这样的:

    [
      { "city" : "Paris", "people" : [{"name" : "John Smith" }, ... ] },
      { "city" : ... },
      { "city" : ... }
    ]
    

    除此之外,您的问题可以使用 underscorejs 解决:

    // Assume the JSON array of people is in a variable called data
    // Group data by city
    data_by_city = _.groupBy(data, function(person) {
      return person["favorites"]["city"]; // Data will be grouped by this key
    });
    
    // Data is now present as { "Paris" : [ people ], ... }
    // Let's convert it to [{ "city" : "Paris", "people" : [ people ] ...
    output = _.map(data_by_city, function(people, city) {
      return { "city" : city, "people" : people };
    });
    

    【讨论】:

    • 这很方便! 谢谢!
    【解决方案4】:

    派对有点晚了,但你走吧! (虽然不如罗斯彭曼的好!) http://jsfiddle.net/Robodude/UzpfQ/

    var people =[
        {"name":"John Smith","favorites":{"color":"orange","city":"Paris"}},
        {"name":"Jane Baker","favorites":{"color":"red","city":"San Francisco"}},
        {"name":"Tommy Jones","favorites":{"color":"blue","city":"Paris"}}
    ];
    
    var cities = [];
    
    for (var i = 0; i < people.length; i++)
    {
        var person = people[i];
    
        var city = person.favorites.city;
    
        var index = null;
        for (var n = 0; n < cities.length; n++)
        {
              var c = cities[n];
            if (c.city == city)
            {
                index = n;
                break;
            }
        }
    
        if (index == null)
        {
            var temp = {
                city: city,
                people: [{name: person.name, favorites: [{color: person.favorites.name}]}]
            };
    
            cities.push(temp);
        }
        else
        {
            cities[index].people.push({name: person.name, favorites: [{color: person.favorites.color}]});
        }
    
    }
    
    console.log(cities);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 2019-10-20
      • 2015-04-09
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多