Как мне суммировать и группировать данные объекта? - PullRequest
3 голосов
/ 23 марта 2020

Как указано выше, как суммировать и группировать данные объекта?
Я пытаюсь использовать forEach & Object.key() для группировки данных.
Но я не слишком знаком с этим.
Это мой пример данных:

const srcArr =[
    {
        "1" : {
            "60" : {
                "point" : 10,
                "count" : 1
            },
            "68" : {
                "point" : 20,
                "count" : 1
            },
        }
    },
    {
        "2" : {
            "60" : {
                "point" : 100,
                "count" : 2
            }
        }
    },
    {
        "1" : {
            "88" : {
                "point" : 50,
                "count" : 1
            },
            "68" : {
                "point" : 20,
                "count" : 1
            },
        }
    },

Мне нужны такие данные:

{ 
  '1': { '60': { money: 10, count: 1 }, 
         '68': { money: 40, count: 2 }, 
         '88': { money: 50, count: 1 }},
  '2': { '60': { money: 100, count: 2 }}
}

Ответы [ 2 ]

3 голосов
/ 23 марта 2020

Попробуйте это

cc = [
    {
        "1" : {
            "60" : {
                "point" : 10,
                "count" : 1
            },
            "68" : {
                "point" : 20,
                "count" : 1
            },
        }
    },
    {
        "2" : {
            "60" : {
                "point" : 100,
                "count" : 2
            }
        }
    },
    {
        "1" : {
            "88" : {
                "point" : 50,
                "count" : 1
            },
            "68" : {
                "point" : 20,
                "count" : 1
            },
        }
    }
]
const result = cc.reduce((arr, o) =>{
    let k = Object.keys(o)[0];
   arr[k] = arr[k] || {};
   let opo = o[k];
   if(arr[k]) {
    Object.keys(arr[k]).map(kk => {
      Object.keys(o[k]).map(cc => {
        if(kk === cc) {
          opo[cc] = opo[cc] || {};
          opo[cc].count =   o[k][cc].count + arr[k][kk].count;
          opo[cc].point =   o[k][cc].point + arr[k][kk].point;
        }
      });
   });
   }        
   arr[k] = {...arr[k], ...opo};    
   return arr;
}, {});

console.log(result);

Может быть, это то, что вы ожидаете. Не обращайте внимания на соглашение об именах ключей: p

2 голосов
/ 23 марта 2020

Я бы использовал Array.reduce

const srcArr = [{
    "1": {
      "60": {
        "point": 10,
        "count": 1
      },
      "68": {
        "point": 20,
        "count": 1
      },
    }
  },
  {
    "2": {
      "60": {
        "point": 100,
        "count": 2
      }
    }
  },
  {
    "1": {
      "88": {
        "point": 50,
        "count": 1
      },
      "68": {
        "point": 20,
        "count": 1
      },
    }
  }
]

let res = srcArr.reduce((arr, o) => {
  // get the key: 1,2, or 3 etc
  let k = Object.keys(o)[0];
  // create a new object with that key if it does not exist
  arr[k] = arr[k] || {};
  // push the objects
  arr[k] = Object.assign(arr[k], o[k]);
  return arr;
}, {});

console.log(res);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...