javascript - 如何根据三个键对数组对象进行分组

标签 javascript arrays

基于这个问题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/

相关文章:

c - 如何在C中的结构中打印字符串

javascript - 替换 contenteditable div 中的单词并正确设置插入符号位置

javascript - 如何从 Vue.js 中的组件生命周期方法访问 mixin 方法内部的函数

javascript - 是否可以使用 for 循环编辑多个数组?

c - 函数返回意外值

arrays - Kotlin - 遍历数组

c++ - 根据intel博客实现concurrent_vector

javascript - 从表中删除项目

javascript - 使用数据库中的 Angular 5 从数据库中获取空对象?

javascript - 网格中的按键或按键事件处理