转置JSON

时间:2011-05-09 17:54:17

标签: javascript json

我想将同类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];

不是手动迭代和构建,是否有一种干净/有效的方法来完成这种转置?

3 个答案:

答案 0 :(得分:5)

你可以通过创建自己的地图函数来做一些interesting things,具体取决于你需要做什么...但是在一天结束时,你将最终迭代原始数组并拔出您感兴趣的价值

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

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'

答案 1 :(得分: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; });

...或者只使用外部库的地图功能:

答案 2 :(得分:0)

我同意Joel的说法,这里没有魔法 - 你需要迭代数组才能提取值。迭代数组的最快方法是一个简单的for循环。有关数组迭代性能的好帖子,请参阅here。即使对于非常大的数组,如果你正确编码它也不应该是非常昂贵的操作。

我想补充的一点是,您是否有机会在创建数据时更改数据结构。例如:如果您有一个创建此数据的循环,您是否还可以在创建年份'对象'数组的同时创建一个'值'数组?