我想将同类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];
不是手动迭代和构建,是否有一种干净/有效的方法来完成这种转置?
答案 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。即使对于非常大的数组,如果你正确编码它也不应该是非常昂贵的操作。
我想补充的一点是,您是否有机会在创建数据时更改数据结构。例如:如果您有一个创建此数据的循环,您是否还可以在创建年份'对象'数组的同时创建一个'值'数组?