如何从JSON对象中构建一个JavaScript键值数组

6
基本上,我有以下来自JSON的对象:
({
    "id" : 3,
    "clientName" : "Avia",
    "monthlyactiveusers" : 2083,
    "dailynewlikes" : 0,
    "totallikes" : 4258,
    "usersgraph" : {
        "sTotalLikes" : [{
            "likes" : 79,
            "date" : "1/1/2010"
        },
        {
            "likes" : 116,
            "date" : "1/1/2010"
        }],
        "sDailyActiveUsers" : [{
            "likes" : 79,
            "date" : "1/1/2010"
        },
        {
            "likes" : 116,
            "date" : "1/1/2010"
        }]
    }
});

我需要以下结果:

sTotalLikes = [['1/1/2010', 79],['1/1/2010', 79],['1/11/2010', 79]];
sDailyActiveUsers = [['1/1/2010', 10],['1/5/2010', 300],['1/11/2010', 220]];

我知道你可以通过以下代码遍历对象来构建数组,但我无法弄清如何构建JavaScript数组本身。提前感谢您的帮助。

var sTotalLikes = new Array();

 for (var i = 0; i < usersgraph.sTotalLikes.length; i++) {
    //how do I build the arry ?
    sTotalLikes[i]
  }

让我想知道是否存在一种奇怪的JavaScript数据结构中的枢轴实用程序。那将是有用的。 - John K
3
这是一个对象字面量,而不是一个 JSON 对象(虽然在它位于字符串中时可能是一个 JSON 对象)。幸运的是,我现在已经收藏了这个网址:http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/。 - Felix Kling
@Felix:是的,+1 - 一个带引号键的JS对象不构成“JSON对象”。 - Matt Ball
4个回答

2

试试这个... 你可以轻松扩展它来获取 sDailyActiveUsers。

var sTotalLikes = new Array();
    var lsTotalLikes = usersgraph.sTotalLikes;
 for (var i = 0; i < lsTotalLikes.length; i++) 
 {

    var obj = lsTotalLikes[i];
        var lArr = []
        lArr.push(obj.date);
        lArr.push(obj.likes);
        sTotalLikes.push(lArr) 
  }

1
建议使用 var sTotalLikes = []; 替换代码中的原有变量。 - UltraInstinct
1
我不想改变原始代码,你可以看看 lArr 的定义,我使用 [],因为我懒得打 :) - Chandu

2

您需要遍历sTotalLikessDailyActiveUsers中的每个项目。

您还可以在此处查看带有注释的完整可用程序的现场演示:)

// declare arrays for storing total likes and active users
var totalLikes = [];
var activeUsers = [];



// first iterate for total likes
for (var i = 0; i < data.usersgraph.sTotalLikes.length; i ++)
{
    var like = data.usersgraph.sTotalLikes[i];

    // create a new array of date and likes
    // and push into total likes
    totalLikes.push([like.date, like.likes]);
}



// then iterate for active users
for (var i = 0; i < data.usersgraph.sDailyActiveUsers.length; i ++)
{
    var user = data.usersgraph.sDailyActiveUsers[i];

    // create a new array of date and likes
    // and push into active users
    activeUsers.push([user.date, user.likes]);
}

希望这能帮到你!

哇!!jsfiddle.net太棒了。感谢你指出这一点。这正是我需要测试我的工具。我正在使用jqplot,最初我尝试使用上面指定的Json字符串来填充它,但由于某种原因它不喜欢它,所以我将只是用它构建一个JavaScript数组。再次感谢您的帮助。 - Vasile Laur

1

看起来你只是想查看对象的值。

var usersgraph = { ... }; // pulled from the data in your question
var result = {};
for (users_key in usersgraph) {
    var vals = [];
    var data = usersgraph[users_key]
    for (k in data) {
        vals.push(values(data[k]));
        // or if you need to order them differently..
        //vals.push([ data[k]['date'], data[k]['likes'] ]);
    }
    result[users_key] = vals;
}

哦,如果你还没有猜到,你可以使用[]来创建一个数组,使用{}来创建一个对象/关联数组。


0

像这样(指你的代码):

/* inside your for loop */
sTotalLikes.push([
    usersgraph.sTotalLikes[i].date,
    usersgraph.sTotalLikes[i].likes
])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接