对象数组按元素分组?

请看这个例子: JsFiddle

问题:我有以下JSON Array

 y= [ {"LngTrend":15,"DblValue":10,"DtmStamp":1358226000000}, {"LngTrend":16,"DblValue":92,"DtmStamp":1358226000000}, {"LngTrend":17,"DblValue":45,"DtmStamp":1358226000000}, {"LngTrend":18,"DblValue":87,"DtmStamp":1358226000000}, {"LngTrend":15,"DblValue":10,"DtmStamp":1358226060000}, {"LngTrend":16,"DblValue":87,"DtmStamp":1358226060000}, {"LngTrend":17,"DblValue":45,"DtmStamp":1358226060000}, {"LngTrend":18,"DblValue":92,"DtmStamp":1358226060000} ] 

我试图通过DtmStamp对这些对象进行DtmStamp最终得到类似这样的东西:

  x = [[1358226000000,10,92,45,87],[1358226060000,10,87,45,92], .......] 

换一种说法:

 x[0][0] = y[0].DtmStamp ; x[0][1] = y[0].LngTrend ; x[0][2] = y[1].LngTrend ; x[0][3] = y[2].LngTrend ; x[0][4] = y[3].LngTrend ; 

不幸的是,它以我不想要的东西结束。

这是我到目前为止所尝试的:

  var dataTrendArray = []; $.each(x, function (index, value) { var trendArray = []; if (index % 4 == 0) { trendArray.push(x[index].DtmStamp); for (var i = 0; i < 4; i++) { index = eval(index + i); trendArray.push(x[index].DblValue); } } console.log(trendArray) ; dataTrendArray.push(trendArray); }); 

有人可以帮助我走上正确的道路吗?

您可以将JavaScript对象用作类似于地图的键/值数据结构。 属性名称将用作键,而属性值将用作值。 这将允许您分组。

 var y = [ {"LngTrend":15,"DblValue":10,"DtmStamp":1358226000000}, {"LngTrend":16,"DblValue":92,"DtmStamp":1358226000000}, {"LngTrend":17,"DblValue":45,"DtmStamp":1358226000000}, {"LngTrend":18,"DblValue":87,"DtmStamp":1358226000000}, {"LngTrend":15,"DblValue":10,"DtmStamp":1358226060000}, {"LngTrend":16,"DblValue":87,"DtmStamp":1358226060000}, {"LngTrend":17,"DblValue":45,"DtmStamp":1358226060000}, {"LngTrend":18,"DblValue":92,"DtmStamp":1358226060000}, ]; var x = {}; for (var i = 0; i < y.length; ++i) { var obj = y[i]; //If a property for this DtmStamp does not exist yet, create if (x[obj.DtmStamp] === undefined) x[obj.DtmStamp] = [obj.DtmStamp]; //Assign a new array with the first element of DtmStamp. //x will always be the array corresponding to the current DtmStamp. Push a value the current value to it. x[obj.DtmStamp].push(obj.DblValue); } console.log(x); //x is now an object grouped by DtmStamp. You can easily turn it back into an array here. 

你应该使用哈希 。 哈希将允许您通过DtmStamp轻松索引所有DblValue值。 这是一个完整的工作示例:

的jsfiddle

 var y = [ {"LngTrend":15,"DblValue":10,"DtmStamp":1358226000000}, {"LngTrend":16,"DblValue":92,"DtmStamp":1358226000000}, {"LngTrend":17,"DblValue":45,"DtmStamp":1358226000000}, {"LngTrend":18,"DblValue":87,"DtmStamp":1358226000000}, {"LngTrend":15,"DblValue":10,"DtmStamp":1358226060000}, {"LngTrend":16,"DblValue":87,"DtmStamp":1358226060000}, {"LngTrend":17,"DblValue":45,"DtmStamp":1358226060000}, {"LngTrend":18,"DblValue":92,"DtmStamp":1358226060000} ]; var x = {}; var i = 0; while(i++ < y.length) { var key = y[i].DtmStamp.toString(); if (typeof(x[key]) == "undefined") x[key] = []; x[key].push(y[i].DblValue); } alert(JSON.stringify(x)); 

关键是对要分组的值使用哈希值。

结果:

 { "1358226060000": [ 92, 45, 87, 10 ], "1358226000000": [ 87, 45, 92, 10 ] } 

如果要防止重复,可以通过将if/then逻辑与indexOf()一起添加来实现。

即使没有填充,你的代码也会推送空的trendArrayindex % 4 != 0 )。 相反,使用这个:

 var dataTrendArray = []; for (var i = 0; i < x.length; i += 4) { var trendArray = [ x[i].DtmStamp ]; for (var j = i, l = Math.max(i + 4, x.length); j < l; j++) { trendArray.push(x[j].DblValue); } // console.log(trendArray) ; dataTrendArray.push(trendArray); } 

但是,如果您只是将trendArrays分组到一个对象中,使用DtmStamp作为键,则可能更合适:

 var dataTrend = {}; for (var i=0; i 

您可以构建一个由DtmStamp索引的稀疏数组。

 var x = []; $.each(y, function(i, obj) { var s = obj.DtmStamp; if(!x[s]) x[s] = []; x[s].push(obj.DblValue); }); //x is now a sparse array, indexed by DtmStamp 

这具有优于对象的优点,即数组元素以DtmStamp顺序。

 //To loop through x for(i in x) { ... } 
  var y = [ {"LngTrend":15,"DblValue":10,"DtmStamp":1358226000000}, {"LngTrend":16,"DblValue":92,"DtmStamp":1358226000000}, {"LngTrend":17,"DblValue":45,"DtmStamp":1358226000000}, {"LngTrend":18,"DblValue":87,"DtmStamp":1358226000000}, {"LngTrend":15,"DblValue":10,"DtmStamp":1358226060000}, {"LngTrend":16,"DblValue":87,"DtmStamp":1358226060000}, {"LngTrend":17,"DblValue":45,"DtmStamp":1358226060000}, {"LngTrend":18,"DblValue":92,"DtmStamp":1358226060000}, ]; var x = {}; for(var k in y){ if(x[y[k]["DtmStamp"]] == undefined) x[y[k]["DtmStamp"]] = []; x[y[k]["DtmStamp"]].push(y[k]["DblValue"]) } alert(JSON.stringify(x)) console.log(x); 

请参阅http://plnkr.co/edit/511sKSdzHGYuvpYqKCPD?p=preview