группировать, фильтровать и считать во вложенном массиве - PullRequest
0 голосов
/ 25 июня 2018

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

var arr = [
  {
    "account": {
      "id": 123,
      "name": "worker"
    },
    "fromCountry": "TE",
    "status": "created"
  },
  {
    "account": {
      "id": 3,
      "name": "worker"
    },
    "fromCountry": "TE",
    "status": "pending"
  },
  {
    "account": {
      "id": 123,
      "name": "worker"
    },
    "fromCountry": "TE",
    "status": "created"
  },
  {
    "account": {
      "id": 1,
      "name": "CEO"
    },
    "fromCountry": "FE",
    "status": "done"
  },
  {
    "account": {
      "id": 1123,
      "name": "worker"
    },
    "fromCountry": "FE",
    "status": "created"
  }
]

Я хочу сгруппировать их по Странам, сосчитать страны и сохранить в дочернем элементе названия типов, а также подсчитать их.Так что это должно выглядеть так:

[
  {
    name: "TE",
    value: 3,
    child: [
      {
        name: "worker",
        count: 2
      },
      {
        name: "CEO",
        count: 1
      }
    ]
  },
  {
    name: "FE",
    value: 2,
    child: [
      {
        name: "worker",
        count: 1
      },
      {
        name: "CEO",
        value: 1
      }
    ]
  }
]

(Примечание: я не хотел бы использовать дополнительные библиотеки javascript)

Не могли бы вы помочь мне, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Ключевой вопрос помимо группировки заключается в том, как получить вложенное свойство. Это группирующее значение берется с помощью вспомогательной функции, которая проверяет, является ли данный ключ массивом или нет. Если массив, то возьмите элементы в качестве ключей для объекта и верните возможно найденное значение. Излишне говорить, что он работает для произвольного числа групп, в зависимости от набора данных.

function getGouped(array, groups) {
    function getValue(object, key) {
        return Array.isArray(key)
            ? key.reduce((o, k) => (o || {})[k], object)
            : object[key];
    }

    var result = [],
        object = { _: { children: result } };

    array.forEach(function (o) {
        groups.reduce(function (r, k) {
            var name = getValue(o, k);
            if (!r[name]) {
                r[name] = { _: { name, count: 0 } };
                r._.children = r._.children || [];
                r._.children.push(r[name]._);
            }
            r[name]._.count++;
            return r[name];
        }, object);
    });
    return result;
}

var data = [{ account: { id: 123, name: "worker" }, fromCountry: "TE", status: "created" }, { account: { id: 3, name: "worker" }, fromCountry: "TE", status: "pending" }, { account: { id: 123, name: "worker" }, fromCountry: "TE", status: "created" }, { account: { id: 1, name: "CEO" }, fromCountry: "FE", status: "done" }, { account: { id: 1123, name: "worker" }, fromCountry: "FE", status: "created" }];

console.log(getGouped(data, ['fromCountry', ['account', 'name']]));
console.log(getGouped(data, ['fromCountry', ['account', 'name'], 'status']));
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 25 июня 2018

Вы можете использовать reduce для группировки массивов в объект.Используйте Object.values для преобразования объекта в массив.Выполните цикл по массиву, используя map, и сформируйте дочернее свойство в массив.

let arr = [{fromCountry:"TE",account:{name: "worker", id: 123},status:"created"},{fromCountry:"TE",account:{name: "worker", id: 3},status:"pending"},{fromCountry:"TE",account:{name: "worker", id: 123},status:"created"}, {fromCountry:"FE",account:{name: "CEO", id: 1},status:"done"}, {fromCountry:"FE",account:{name: "worker", id: 1123},status:"created"}];
	

let result = Object.values(arr.reduce((c, v) => {
  let f = v.fromCountry;
  c[f] = c[f] || {name: f,value: 0,child: {}};
  c[f].child[v.account.id] = c[f].child[v.account.id] || {name: v.account.name,count: 0}
  c[f].value++;
  c[f].child[v.account.id].count++;
  return c;
}, {})).map(o => {
  o.child = Object.values(o.child);
  return o;
});

console.log(result);
...