Как считать в массиве объектов используя lodash - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть массив объектов следующим образом:

[
    {
        company: "CompanyName",
        id: "1",

        userProfile: {
            id: "2",            
            telephone: "",
            user: {
                email: "some_email",
                firstName: "Firstname",
                lastName: "Lastname",
                groups: [
                    {id: "2", name: "Manager"},
                    {id: "10", name: "Remarketing Manager"}
                ]
            }
        }
    },
    {
        company: "CompanyName",
        id: "2",

        userProfile: {
            id: "3",
            telephone: "",
            user: {
                email: "some_email",
                firstName: "Firstname",
                lastName: "Lastname",
                groups: [
                    {id: "1", name: "Seller"}
                ]
            }
        }
    },
    {
        company: "CompanyName",
        id: "3",

        userProfile: {
            id: "4",
            telephone: "",
            user: {
                email: "some_email",
                firstName: "Firstname",
                lastName: "Lastname",
                groups: [
                    {id: "2", name: "Manager"}
                ]
            }
        }
    }
]

Я хочу считать по group name.

Таким образом, результат, который я хочу получить:

{
   "Manager": 2,
   "Seller": 1,
   "Remarketing Manager": 1,
}

Я пытался с lodash countBy следующим образом:

countBy(users, 'userProfile.user.groups.name');

Но это не работает.

Вот скрипка.

Ответы [ 2 ]

3 голосов
/ 26 апреля 2019

Свести массивы групп с помощью _.flatMap(), а затем считать по имени:

const data = [{"company":"CompanyName","id":"1","userProfile":{"id":"2","telephone":"","user":{"email":"some_email","firstName":"Firstname","lastName":"Lastname","groups":[{"id":"2","name":"Manager"},{"id":"10","name":"Remarketing Manager"}]}}},{"company":"CompanyName","id":"2","userProfile":{"id":"3","telephone":"","user":{"email":"some_email","firstName":"Firstname","lastName":"Lastname","groups":[{"id":"1","name":"Seller"}]}}},{"company":"CompanyName","id":"3","userProfile":{"id":"4","telephone":"","user":{"email":"some_email","firstName":"Firstname","lastName":"Lastname","groups":[{"id":"2","name":"Manager"}]}}}]

const result = _.countBy(_.flatMap(data, 'userProfile.user.groups'), 'name')

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
1 голос
/ 26 апреля 2019

Вы можете использовать уменьшить

let data = [{company: "CompanyName",id: "1",userProfile: {id: "2",telephone: "",user: {email: "some_email",firstName: "Firstname",lastName: "Lastname",groups: [{id: "2", name: "Manager"},{id: "10", name: "Remarketing Manager"}]}}},{company: "CompanyName",id: "2",userProfile: {id: "3",telephone: "",user: {email: "some_email",firstName: "Firstname",lastName: "Lastname",groups: [{id: "1", name: "Seller"}]}}},{company: "CompanyName",id: "3",userProfile: {id: "4",telephone: "",user: {email: "some_email",firstName: "Firstname",lastName: "Lastname",groups: [{id: "2", name: "Manager"}]}}}]

let final = data.reduce((op,{userProfile:{user:{groups}}}) => {
  groups.forEach(({name}) => {
    op[name] = op[name] || 0
    op[name]++
  })
  return op
},{})

console.log(final)
...