如何从 json 对象构建键值的 JavaScript 数组

Posted

技术标签:

【中文标题】如何从 json 对象构建键值的 JavaScript 数组【英文标题】:How to build a JavaScript array of key values form a json object 【发布时间】:2011-05-27 10:38:42 【问题描述】:

基本上我有以下 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 数据结构的某种奇怪的枢轴实用程序。那会很有用。 ...它是一个对象字面量,而不是一个 JSON 对象(尽管它在字符串中时可能曾经是一个 JSON 对象)。幸运的是,我现在为这个 URL 添加了书签:benalman.com/news/2010/03/theres-no-such-thing-as-a-json @Felix: 是的,+1 - 带有引号键的 JS 对象不是“JSON 对象”。 【参考方案1】:

您必须遍历 sTotalLikessDailyActiveUsers 中的每个项目。

您也可以see the live demo here 使用 cmets 获取完整且有效的程序。 :)

// 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 数组它。再次感谢您的帮助。【参考方案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) 
  

【讨论】:

首选var sTotalLikes = []; 而不是代码中的那个。 :) 我不想改变OP的初始代码,你可以看一下lArr定义,我用过[],因为我懒得打字:)【参考方案3】:

在我看来,您只是想查看对象的值。

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;

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

【讨论】:

【参考方案4】:

像这样(参考你的代码):

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

【讨论】:

以上是关于如何从 json 对象构建键值的 JavaScript 数组的主要内容,如果未能解决你的问题,请参考以下文章

从具有不同值的逗号分隔 JSON 对象填充 html 下拉列表

使用 Spring boot 解析具有无效键值的 JSON 对象

PostgreSQL 查询包含特定键值的 json 对象中的行

怎样从对象中获取键值并保存在对象中

MySQL JSON:如何从键值中查找对象

在对象的 json 数组中找到一个键值并返回另一个带有角度的键值