转换JSON

3

我希望能够将同类JSON集合的所有属性提取到它自己的数组中。

例如,给定:

var dataPoints = [
    {
        "Year": 2005,
        "Value": 100 
    },
    {
        "Year": 2006,
        "Value": 97 
    },
    {
        "Year": 2007,
        "Value": 84 
    },
    {
        "Year": 2008,
        "Value": 102 
    },
    {
        "Year": 2009,
        "Value": 88 
    },
    {
        "Year": 2010,
        "Value": 117 
    },
    {
        "Year": 2011,
        "Value": 104 
    }
];

我希望提取dataPoints中所有值的数组,类似于以下内容:
var values = [100, 97, 84, 102, 88, 117, 104];

有没有一种简洁/高效的方式来完成这种转置,而不是手动迭代和构造?


非常小的提示:有效的JSON需要在对象键周围使用双引号。 - sdleihssirhc
那不是 JSON,它是数组/对象字面量。 - Dave Ward
这甚至不是JSON,而是对象数组。 - mVChr
3个回答

5

如果您需要根据需求创建自己的map函数,您可以尝试一些有趣的事情...但是说到底,您最终都需要遍历原始数组并提取您感兴趣的值。

只是为了好玩,给出这个方法:

function project(a, fn)
{
var list = new Array();
    for (i = 0; i < a.length; i++)
    {
        list.push(fn(a[i]));
    }
return list;
}

你可以轻松获得一个类似于你所描述的数组:

var dataPoints = [
    { Year: 2005,
      Value: 100
    },
    { Year: 2006,
      Value: 97
    },
    { Year: 2007,
      Value: 84
    },
    { Year: 2008,
      Value: 102
    },
    { Year: 2009,
      Value: 88
    },
    { Year: 2010,
      Value: 117
    },
    { Year: 2011,
      Value: 104
    }
];

var list = project(dataPoints, function(p) { return p.Value; });

alert(list[0]);  // alerts '100'

刚刚查看了ECMA规范和数组上的console.log,似乎没有任何优雅或者hack的方式来实现这个。+1 - Demian Brecht

5

最终,你需要做一些迭代。

这里你需要一个map函数:

function map(array, callback) {
    var result = [],
        i;

    for (i = 0; i < array.length; ++i) {
        result.push(callback(array[i]));
    }

    return result;
}

// ...

var values = map(dataPoints, function(item) { return item.Value; });

...或者只需使用外部库的map函数:


0

我同意Joel的观点,这里没有什么魔法 - 你需要迭代数组以提取值。迭代数组的最快方法是使用简单的for循环。请参见此处了解有关数组迭代性能的良好文章。归根结底,即使对于非常大的数组,如果您正确编写代码,这也不应该是一个非常昂贵的操作。

我想补充的一件事是,您是否有机会在创建数据时更改数据结构。例如:如果您有一个循环来创建这些数据,您是否可以同时创建一个“值”的数组和一个年份“对象”的数组?


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