Javascript 如何基于三个键对数组对象进行分组

Javascript 如何基于三个键对数组对象进行分组,javascript,arrays,Javascript,Arrays,基于这个问题, 我引用了这个答案,答案是 所以我从这个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},{

基于这个问题,

我引用了这个答案,答案是

所以我从这个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}
[        { 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}] 
         }]

这就是我的数组的开始

$(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],如果我把它记录下来,就会是这样

{"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}
[        { 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 merge解决问题,但似乎我无法解决问题,任何帮助都很好

基于您的方法,如果元素不存在,我将尝试推送,如果元素存在,则推送到现有元素上的数据点数组。我还没试过这个,但它可以用

data.forEach(e => {
    const tempIndex = tmp.findIndex(el => el.prov === e.prov);
    if (tempIndex) {
        tmp[tempIndex].dataPoints.push({ x: e.datax, y: e.datay });
    } else {
        tmp.push({
            type: "firstid",
            prov: e.prov,
            name: e.pname,
            showInLegend: false,
            dataPoints: [{ x: e.datax, y: e.datay }],
        })
    }
});

请让我知道使用
Array.prototype.reduce
Array.prototype.find
这种经过编辑的方法是否更好

减少数组中每个元素上的循环。它以一个空数组开始:
[]
。然后,代码使用
find
检查元素是否已在新数组中。如果是,则将
数据点添加到现有数组中。如果该对象不存在,请将其推送到新数组

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.666666666,“prov”:“12”,“datay”:2};
对象减少=对象减少((acc,cur)=>{
const dbItem=acc.find(element=>element.prov===cur.prov);
if(dbItem)
{
dbItem.dataPoints.push({x:cur.datax,y:cur.datay});
}
其他的
{
acc.push({type:“firstid”,
prov:cur.prov,
名称:cur.pname,
showInLegend:false,
数据点:[{x:cur.datax,y:cur.datay}]
});
}
返回acc;
}, []);
console.log(objReduced)
obj=[{
输入:“第一个ID”,
箴言:11,
姓名:“some1”,
showInLegend:false,
数据点:[{
x:2.0643278,
y:1

}]
在合并数据点数组之前,此项还将检查数据点数组中的重复项:

const数据=[{
输入:“第一个ID”,
箴言:11,
姓名:“some1”,
showInLegend:false,
数据点:[{
x:2.0643278,
y:1
}]
},
{
输入:“第一个ID”,
箴言:11,
姓名:“some1”,
showInLegend:false,
数据点:[{
x:3.2142857142857144,
y:1
}]
},
{
输入:“第一个ID”,
箴言:12,
名称:“some2”,
showInLegend:false,
数据点:[{
x:1.125,
y:1
}]
},
{
输入:“第一个ID”,
箴言:12,
名称:“some2”,
showInLegend:false,
数据点:[{
x:1.66666667,
y:1
}]
}
];
常数res=对象值(数据减少((acc,curr)=>{
constgroupkey=['type','prov','name','showInLegend'].map(x=>curr[x]).join('-');
如果(!acc[groupKey]){
acc[groupKey]=当前值;
}否则{
对于(当前数据点的常量{x:currX,y:currY}){
对于(acc[groupKey].dataPoints的常量{x:accX,y:accY}){
如果((currX+'-'+currY)!==(accX+'-'+accY)){
acc[groupKey].dataPoints.push({x:currX,y:currY});
}
}
}
}
返回acc;
}, {}));

console.log(res);
向我们展示您的尝试,以便我们可以从那里帮助您。您能告诉我们您希望对代码执行什么操作的上下文吗?好的,我将编辑我的问题这是一个对象数组
[{…},{…},…]
不是多维数组
[[…],[…],…]
好的,对不起,我已经编辑了标题。我尝试了这个标题,但数据点没有按id分组,它仍然是分开的。虽然@attaroqqi我编辑了一些方法,但可能会起作用,让我知道这是否解决了您的问题。如果这个标题在我的代码中运行良好,上帝保佑您