更新Node.js中的对象字段数组

时间:2019-05-04 08:08:35

标签: javascript arrays node.js mongoose

JSON文档:

{
    "_id" :
    "description": "task1",
    "completed": false,
    "subTask": [
        {
            "taskID": "01",
            "subTaskCompletion": "false",
            "subTaskDescription": "task 1 sub task 1 desc"
        },
        {
            "taskID": "02",
            "subTaskCompletion": "false",
            "subTaskDescription": "task 1 sub task 2 desc"
        }
    ]
}

我可以使用以下代码更新“说明”和“完成”:

Node.js:

router.patch('/tasks/:id', auth, async (req, res) => {
    const updates = Object.keys(req.body)
    const allowedUpdates = ['description', 'completed']
    const isValidOperation = updates.every((update) => allowedUpdates.includes(update))

    if (!isValidOperation) {
        return res.status(400).send({ error: 'Invalid updates!' })
    }

    try {
        const task = await Task.findOne({ _id: req.params.id})

        if (!task) {
            return res.status(404).send()
        }

        updates.forEach((update) => task[update] = req.body[update])
        await task.save()
        res.send(task)
    } catch (e) {
        res.status(400).send(e)
    }
})

我将这些作为请求正文传递

{
    "description": "task modified",
    "completed": true
}

但是,我找不到将“ taskID”为“ 01”的subTask的“ subTaskCompletion”更新为“ true”的方法

2 个答案:

答案 0 :(得分:0)

您可以尝试--

router.patch('/tasks/:id', auth, async (req, res) => {
const updates = Object.keys(req.body)
const allowedUpdates = ['description', 'completed', 'subTask']
const isValidOperation = updates.every((update) => allowedUpdates.includes(update))

if (!isValidOperation) {
    return res.status(400).send({ error: 'Invalid updates!' })
}

try {
    const task = await Task.findOne({ _id: req.params.id})

    if (!task) {
        return res.status(404).send()
    }

    updates.forEach((update) => {
      task[update] = update === 'subTask' 
        ? task[update].map(subTask => subTask.taskID === req.body[update].taskID ? req.body[update] : subTask)
        : req.body[update]
    })
    await task.save()
    res.send(task)
} catch (e) {
    res.status(400).send(e)
}

并通过

{
"description": "task modified",
"completed": true,
"subTask": {
    "taskID": "01",
    "subTaskCompletion": "true"
 }
}

答案 1 :(得分:0)

在请求正文中添加一个新字段,该字段包含您要标记为已完成的子任务ID。

在示例中,名为markSubTasksDone的字段需要输入代码:

router.patch('/tasks/:id', auth, async (req, res) => {
  const updates = Object.keys(req.body)
  const allowedUpdates = ['description', 'completed', 'markSubTasksDone'] // add a new field
  const isValidOperation = updates.every((update) => allowedUpdates.includes(update))

  if (!isValidOperation) {
    return res.status(400).send({ error: 'Invalid updates!' })
  }

  try {
    const task = await Task.findOne({ _id: req.params.id })

    if (!task) {
      return res.status(404).send()
    }

    updates.forEach((update) => task[update] && (task[update] = req.body[update])) // make sure `update` property is exist

    // mark subTask as done
    const listSubTaskIds = req.body.markSubTasksDone
    if (listSubTaskIds && listSubTaskIds.length) {
      listSubTaskIds.forEach(taskId => {
        const subTask = task.subTask.find(i => i.taskId === taskId)
        if (subTask) {
          subTask.subTaskCompletion = true;
        }
      });
    }

    await task.save()
    res.send(task)
  } catch (e) {
    res.status(400).send(e)
  }
})

并请求正文:

{
  "description": "task modified",
  "completed": true,
  "markSubTasksDone": ["01"]
}
相关问题