Фильтрация по массиву JS объектов и добавление значения шагов, где userName совпадает - PullRequest
2 голосов
/ 08 апреля 2020

Я работаю с JavaScript. Это может быть относительно проще для профессиональных разработчиков. Я хочу l oop через массив объектов и фильтровать объекты с тем же именем пользователя и добавлять их шаги. Следующий ответ - это ответ от моего API:

{
    "status": 1,
    "UserList": [
        {
            "_id": "5e8c04882e31eb0fa0f240dd",
            "userName": "devyansh",
            "starttime": 1586073600,
            "endtime": 1586077200,
            "steps": 1000,
            "createdTime": 1586234504,
            "__v": 0
        },
        {
            "status": "1",
            "_id": "5e8c04f82e31eb0fa0f240df",
            "userName": "devyansh",
            "starttime": 1586080800,
            "endtime": 1586084400,
            "steps": 47,
            "createdTime": 1586234616,
            "__v": 0
        },
        {
            "_id": "5e8c282e5040a21c1498d95b",
            "userName": "amit",
            "starttime": 1586170800,
            "endtime": 1586131200,
            "steps": 899,
            "createdTime": 1586243630,
            "__v": 0
        },
}

Мне нужно отфильтровать этот UserList, используя userName, и добавить шаги, если userName будет идентичным. Вот как я хочу получить ответ:

{
   "status": 1,
   "finalList": [
    {
        "totalsteps": 1047,
        "list": [
            {
                "_id": "5e8c04882e31eb0fa0f240dd",
                "userName": "devyansh",
                "starttime": 1586073600,
                "endtime": 1586077200,
                "steps": 1000,
                "createdTime": 1586234504,
                "__v": 0
            },
            {
                "status": "1",
                "_id": "5e8c04f82e31eb0fa0f240df",
                "userName": "devyansh",
                "starttime": 1586080800,
                "endtime": 1586084400,
                "steps": 47,
                "createdTime": 1586234616,
                "__v": 0
            }
        ],
    },
    {
        "totalsteps": 899,
        "list": [
            "_id": "5e8c282e5040a21c1498d95b",
            "userName": "amit",
            "starttime": 1586170800,
            "endtime": 1586131200,
            "steps": 899,
            "createdTime": 1586243630,
            "__v": 0
          ],
    },
  ]
}

Я уже пробовал это, но не получил ожидаемый результат,

var nameArray = []

  foundData.map((data) => {
     if (!nameArray.includes(data.userName)){
        nameArray.push(data.userName)
     }
  })
  console.log("nameArray",nameArray)
  var finalArray = nameArray.map((data1) => {
     return(  foundData.filter((data) => {
        return data1 === (data.userName)
        }))
     })
  console.log("finalArray",finalArray)

Спасибо, заранее. Буду признателен за любую оказанную помощь.

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Мы можем сгруппировать массив по userName, а затем суммировать steps и pu sh элемент массива внутри list. Так что это может быть сделано через reduce метод :

const result = obj.UserList.reduce((a, {userName, steps, ...rest})=> {
  a[userName] = a[userName] || {totalsteps: 0, list:[]};
  a[userName].totalsteps += steps;
  a[userName].list.push({userName, steps, ...rest});
  return a;
}, {})

console.log(Object.values(result));

Пример:

let obj = {
    "status": 1,
    "UserList": [
        {
            "_id": "5e8c04882e31eb0fa0f240dd",
            "userName": "devyansh",
            "starttime": 1586073600,
            "endtime": 1586077200,
            "steps": 1000,
            "createdTime": 1586234504,
            "__v": 0
        },
        {
            "status": "1",
            "_id": "5e8c04f82e31eb0fa0f240df",
            "userName": "devyansh",
            "starttime": 1586080800,
            "endtime": 1586084400,
            "steps": 47,
            "createdTime": 1586234616,
            "__v": 0
        },
        {
            "_id": "5e8c282e5040a21c1498d95b",
            "userName": "amit",
            "starttime": 1586170800,
            "endtime": 1586131200,
            "steps": 899,
            "createdTime": 1586243630,
            "__v": 0
        }
      ]
};

const result = obj.UserList.reduce((a, {userName, steps, ...rest})=> {
  a[userName] = a[userName] || {totalsteps: 0, list:[]};
  a[userName].totalsteps += steps;
  a[userName].list.push({userName, steps, ...rest});
  return a;
}, {})

console.log(Object.values(result));
0 голосов
/ 08 апреля 2020

Go поверх UserList, создайте объект с ключами как «userName».
Когда userName уже существует в объекте, просто обновите шаги и список.
После итерации, получите Object.values() указанного выше объекта, чтобы получить его как массив.

const format = arr => {
  const res = {};
  arr.forEach(item => {
    if (!res[item.userName]) {
      res[item.userName] = {
        totalsteps: 0,
        list: []
      };
    }
    res[item.userName].totalsteps += item.steps;
    res[item.userName].list.push(item);
  });
  return Object.values(res);
};

const resp = {
  status: 1,
  UserList: [
    {
      _id: "5e8c04882e31eb0fa0f240dd",
      userName: "devyansh",
      starttime: 1586073600,
      endtime: 1586077200,
      steps: 1000,
      createdTime: 1586234504,
      __v: 0
    },
    {
      status: "1",
      _id: "5e8c04f82e31eb0fa0f240df",
      userName: "devyansh",
      starttime: 1586080800,
      endtime: 1586084400,
      steps: 47,
      createdTime: 1586234616,
      __v: 0
    },
    {
      _id: "5e8c282e5040a21c1498d95b",
      userName: "amit",
      starttime: 1586170800,
      endtime: 1586131200,
      steps: 899,
      createdTime: 1586243630,
      __v: 0
    }
  ]
};

const result = { status: resp.status, finalList: format(resp.UserList) };

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