Задать вопрос

Как правильно посчитать данные в JSON?

Суть такова, я имею json файл:
[
    {
        "id": 0,
        "username": "Antony",
        "users": [
            {
                "id": 1,
                "like": 0
            },
            {
                "id": 2,
                "like": 1
            },
            {
                "id": 3,
                "like": 0
            },
            {
                "id": 4,
                "like": 1
            }
        ]
    },
    {
        "id": 1,
        "username": "Janet",
        "users": [
            {
                "id": 0,
                "like": 0
            },
            {
                "id": 2,
                "like": 1
            },
            {
                "id": 3,
                "like": 1
            },
            {
                "id": 4,
                "like": 1
            }
        ]
    },.......

Мне необходимо посчитать, какое количество "лайков", есть у каждого пользователя.
Тоесть:
К примеру берем первый id == 0.
Проходим по объектам, которых может быть очень много и смотрим:
Если id == 0 и like == 1 добавляем к массиву +1.
В итоге у меня должно выйти:
usersWithLikes[id пользователя] = количество лайков во всех объектах

usersWithLikes[0] = 3
usersWithLikes[1] = 1
usersWithLikes[2] = 4
usersWithLikes[3] = 0


На данный момент я считаю вот так:
thumbsUp_data - данные json

var usersWithLikes = thumbsUp_data.map(function(user_data){
                    return user_data.users.filter(function(value){
                        return value.like == 1;
                    }).length;
                });


Но это не правильно, поскольку считает сколько лайков в объекте.
Помогите с решением...
  • Вопрос задан
  • 2467 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
isqua
@isqua
Научу HTML, CSS, JS, BEM и Git
var usersWithLikes = {};

thumbsUp_data.forEach(function(data) {
    data.users.forEach(function(value) {
        // Если переменная пуста, положим туда 0
        usersWithLikes[value.id] = usersWithLikes[value.id] || 0;
        
        // Прибавим лайк
        usersWithLikes[value.id] += value.like;
    });
});

// На выходе получился хеш. Если надо именно массив, можно сделать так:
usersWithLikes = Array.prototype.slice.call(usersWithLikes, 0);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@alvoro
var likes = users.reduce(function (likes, user) {
  user.users.forEach(function (user) {
    likes[user.id] = likes[user.id]|| 0;
    likes[user.id] += user.like;
  });
  return likes;
}, {});
console.log(likes)


Вряд ли это то, что вам надо, но задумка должна быть ясна
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы