Группировать объект по ключу с помощью jsonata

Я хочу сгруппировать и суммировать следующие входные данные.

{"users": [
  {
    "ADMIN": [
      {
        "ADMIN_03": 46,
        "ADMIN_01": 2
      }
    ],
    "CUSTOMER": [
      {
        "CUSTOMER_01": 1
      }
    ]
  },
  {
    "ADMIN": [
      {
        "ADMIN_03": 35
      }
    ]
  },
  {
    "ADMIN": [
      {
        "ADMIN_01": 12
      }
    ],
    "CUSTOMER": [
      {
        "CUSTOMER_03": 2
      }
    ]
  }
]}

Вывод должен быть сгруппирован по таким клавишам, как ADMIN, а внутренние пары ключ / значение должны быть сгруппированы и суммированы.

{    "users": [
      {
        "ADMIN":[
          {
             "ADMIN_01": 14
             "ADMIN_03": 81,
          },
        "CUSTOMER":[
          {
             "CUSTOMER_01": 1,
             "CUSTOMER_03": 2
          }
    ]
}

Есть идеи, как это сделать с JSONATA?


person jukow    schedule 09.03.2021    source источник
comment
пожалуйста, добавьте фрагмент того, что вы пробовали.   -  person Vini    schedule 09.03.2021


Ответы (2)


Вы можете использовать reduce и вложенный foreach, взяв Object.entries:

const users= [ { "ADMIN": [ { "ADMIN_03": 46, "ADMIN_01": 2 } ], "CUSTOMER": [ { "CUSTOMER_01": 1 } ] }, { "ADMIN": [ { "ADMIN_03": 35 } ] }, { "ADMIN": [ { "ADMIN_01": 12 } ], "CUSTOMER": [ { "CUSTOMER_03": 2 } ] }];

const result = users.reduce((a,o)=>{
    Object.entries(o).forEach(([key, value])=>{
      value.forEach(v=>{
        Object.entries(v).forEach(([name, count])=>{
            (a[key] ??={})[name] ??= 0;
             a[key][name]+=count;
          });
        });
    });
    return a;
},{});

console.log(result);

person gorak    schedule 09.03.2021
comment
Отлично работает с простым JavaScript. Вы можете объяснить двойник ?? мне? Я такого раньше не видел. - person jukow; 09.03.2021
comment
@jukow это логическое нулевое присвоение. прочтите об этом здесь developer.mozilla.org/en- США / docs / Web / JavaScript / Reference / - person gorak; 09.03.2021

Похоже, вам нужен этот результат в конце.

    data = {
  users: [
    {
      ADMIN: [
        {
          ADMIN_03: 46,
          ADMIN_01: 2,
        },
      ],
      CUSTOMER: [
        {
          CUSTOMER_01: 1,
        },
      ],
    },
    {
      ADMIN: [
        {
          ADMIN_03: 35,
        },
      ],
    },
    {
      ADMIN: [
        {
          ADMIN_01: 12,
        },
      ],
      CUSTOMER: [
        {
          CUSTOMER_03: 2,
        },
      ],
    },
  ],
};

function summerize(users) {
  let result = { users: {} };
  for (let i = 0; i < users.length; i++) {
    const user = users[i];

    for (const [username, userValue] of Object.entries(user)) {
      if (typeof result.users[username] === "undefined")
        result.users[username] = {};
      for (let j = 0; j < userValue.length; j++) {
        const item = userValue[j];
        for (const [key, value] of Object.entries(item)) {
          if (typeof result.users[username][key] === "undefined") {
            result.users[username][key] = 0;
          }
          result.users[username][key] += value;
        }
      }
    }
  }
  return result;
}

Результат

{
  "users": {
    "ADMIN": { "ADMIN_03": 81, "ADMIN_01": 14 },
    "CUSTOMER": { "CUSTOMER_01": 1, "CUSTOMER_03": 2 }
  }
}
person Milad Raeisi    schedule 09.03.2021