【问题标题】:Filtering through JS array of objets and adding the steps value where userName is same通过对象的JS数组过滤并添加userName相同的steps值
【发布时间】:2020-07-20 12:15:27
【问题描述】:

我正在使用 JavaScript。对于专业开发人员来说,这可能相对容易一些。我想遍历对象数组并过滤具有相同用户名的对象并添加它们的步骤。以下响应是来自我的 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
        },
}

我需要使用用户名过滤这个用户列表,如果发现用户名相同,则添加步骤。这是我希望的响应方式,

{
   "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)

谢谢,提前。任何帮助深表感谢。

【问题讨论】:

  • 这纯粹是一个算法问题,并不是一个很复杂的问题。在要求我们为您解决之前,请展示您尝试解决的方法:) 提示:您需要迭代数组才能实现它

标签: javascript arrays node.js object


【解决方案1】:

我们可以通过userName对数组进行分组,然后对steps求和,并将数组的元素推入list。所以可以做到through reduce method:

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));

【讨论】:

    【解决方案2】:

    遍历用户列表,构建一个带有“用户名”键的对象。
    当对象中已经存在用户名时,只需更新步骤和列表。
    迭代后,获取上述对象的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);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      • 2019-07-18
      • 2020-09-17
      • 2021-07-08
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      相关资源
      最近更新 更多