基于这个问题Group array items using object
我引用了这个答案,回答者是https://stackoverflow.com/users/1094311/1983
所以我从这个 jquery 获取数据,然后解析它,然后将其推送到变量
我从myurl获取的数据是这样的
{"pname":"some1","datax":2.0643278,"prov":"11","datay":1},{"pname":"some1","datax":3.2142857142857144,"prov":"11","datay":1},{"pname":"some2","datax":1.125,"prov":"12","datay":1},{"pname":"some2","datax":1.6666666666666667,"prov":"12","datay":2}
这就是我的数组的开始
$(document).ready(function(){
$.ajax({
url: "myurl",
method: "GET",
success: function(data) {
var parsedJSON = JSON.parse(data);
var result1 = [
(function(data) {
let tmp = [];
data.forEach(e => {
tmp.push({
type: "firstid",
prov: e.prov,
name: e.pname,
showInLegend:false,
dataPoints:[{x:e.datax, y:e.datay}],
})
});
return tmp;
})(parsedJSON)
];
从那里我得到了 result1[0],如果我控制台记录它,它会像这样
[ { type: "firstid",
prov: 11,
name: some1,
showInLegend:false,
dataPoints:[{x:2.0643278, y:1}]
},
{ type: "firstid",
prov: 11,
name: some1,
showInLegend:false,
dataPoints:[{x:3.2142857142857144, y:1}]
},
{ type: "firstid",
prov: 12,
name: some2,
showInLegend:false,
dataPoints:[{x:1.125, y:1}]
},
{ type: "firstid",
prov: 12,
name: some2,
showInLegend:false,
dataPoints:[{x:1.6666666666666667, y:1}]
}]
当我控制台记录它时,我希望得到一些像这样的数组:
[ { type: "firstid",
prov: 11,
name: some1,
showInLegend:false,
dataPoints:[ {x:2.0643278, y:1},
{x:3.2142857142857144, y:1}]
},
{ type: "firstid",
prov: 12,
name: some2,
showInLegend:false,
dataPoints:[ {x:1.125, y:1},
{x:1.6666666666666667, y:1}]
}]
我花了很多时间试图通过数组合并来解决这个问题,但似乎我无法弄清楚,任何帮助都会很好
最佳答案
使用 Array.prototype.reduce 和 Array.prototype.find 应该可以解决问题。
reduce
循环遍历数组中的每个元素。它以一个空数组开始:[]
。然后,代码使用 find
检查元素是否已在新数组中。如果是这样,请将 dataPoints
添加到现有数组中。如果不存在,则将对象推送到新数组。
const obj = [{"pname":"some1","datax":2.0643278,"prov":"11","datay":1},{"pname":"some1","datax":3.2142857142857144,"prov":"11","datay":1},{"pname":"some2","datax":1.125,"prov":"12","datay":1},{"pname":"some2","datax":1.6666666666666667,"prov":"12","datay":2}];
objReduced = obj.reduce((acc, cur) => {
const dbItem = acc.find( element => element.prov === cur.prov);
if (dbItem)
{
dbItem.dataPoints.push({x: cur.datax, y: cur.datay});
}
else
{
acc.push({ type: "firstid",
prov: cur.prov,
name: cur.pname,
showInLegend: false,
dataPoints: [{x: cur.datax, y: cur.datay}]
});
}
return acc;
}, []);
console.log(objReduced);
obj = [{
type: "firstid",
prov: 11,
name: "some1",
showInLegend: false,
dataPoints: [{
x: 2.0643278,
y: 1
}]
关于javascript - 如何根据三个键对数组对象进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59910682/