При попытке ПОМЕСТИТЬ объект в мой массив эта функция фильтра не удаляет старый объект

#javascript #arrays #node.js #express #put

#javascript #массивы #node.js #выразить #поместить

Вопрос:

Репо: https://github.com/leongaban/api-design-node/tree/master

Моя коллекция почтальонов: https://www.getpostman.com/collections/b5a03b07836ad34b7758

Ожидаемый:

Текущие символы «lion»:

 [
    {
        "id": "1",
        "name": "Teemo",
        "pride": "LoL",
        "age": "1",
        "gender": "male"
    },
    {
        "id": "2",
        "name": "Nasus",
        "pride": "LoL",
        "age": "10",
        "gender": "male"
    }
]
  

ПОМЕСТИТЬ http://localhost:3000/lions/1

Тело:

 {
    "age": "1",
    "gender": "female",
    "name": "LuLu",
    "pride": "LoL"
}
  

Следует вернуть этот новый список при ПОЛУЧЕНИИ всех львов:

 [
    {
        "id": "1",
        "name": "LuLu",
        "pride": "LoL",
        "age": "1",
        "gender": "female"
    },
    {
        "id": "2",
        "name": "Nasus",
        "pride": "LoL",
        "age": "10",
        "gender": "male"
    }
]
  

Результаты

 [
    {
        "id": "2",
        "name": "Nasus",
        "pride": "2",
        "age": "2",
        "gender": "female"
    },
    {
        "0": { // <-- This should not be here
            "id": "1",
            "name": "Teemo",
            "pride": "1",
            "age": "1",
            "gender": "female"
        },
        "age": "1",
        "gender": "female",
        "name": "LuLu",
        "pride": "LoL"
    }
]
  

Полный server.js

 const express = require('express')
const app = express()
const bodyParser = require('body-parser')
const path = require('path')
const port = 3000

app.use(express.static('client'))
app.use(bodyParser.urlencoded({ extended: true }))
app.use(bodyParser.json())

let lions = []
let id = 0

app.get('/lions', function(req, res) {
  console.log('GET lions:', lions)
  res.json(lions)
})

app.get('/lions/:id', function(req, res) {
  let lion = lions.filter((lion => lion.id === req.params.id))

  res.json(lion || {})
})

app.post('/lions', function(req, res) {
  id  
  const lion = Object.assign({ id: id.toString() }, req.body)
  lions.push(lion)

  res.json(lion)
});

app.put('/lions/:id', function(req, res) {
  const paramId = req.params.id
  const updated = req.body

  if (updated.id) {
    delete updated.id
  }

  const oldLion = lions.filter((lion => lion.id === paramId))

  if (!oldLion) {
    res.send()
  }

  const newLion = Object.assign(updated, oldLion)
  console.log('newLion', newLion)
  lions = lions.filter(lion => lion.id !== paramId)
  lions.push(newLion)

  res.json(newLion)
});

app.listen(port, () => console.log(`NODE RUNNING on port: ${port}`))

  

Функция PUT

 app.put('/lions/:id', function(req, res) {
  const paramId = req.params.id
  const updated = req.body

  if (updated.id) {
    delete updated.id
  }

  // Here I find the oldLion to replace by id:
  const oldLion = lions.filter((lion => lion.id === paramId))

  if (!oldLion) {
    res.send()
  }

  // Here I create a new object for the new "lion":
  const newLion = Object.assign(updated, oldLion)
  console.log('newLion', newLion)

  // Here I filter out the old lion:
  lions = lions.filter(lion => lion.id !== paramId)

  // New lion is pushed in:
  lions.push(newLion)

  res.json(newLion)
});
  

Комментарии:

1. На app.put() , когда вы это сделаете const oldLion = lions.filter((lion => lion.id === paramId)) , вы получите массив в качестве результата. Я полагаю, вы хотите использовать Array.find() вместо filter там, потому что позже вы вызываете это: const newLion = Object.assign(updated, oldLion) .

2. Это было именно так const oldLion = lions.find((lion => lion.id === paramId)) , мне также нужно было обновить мой объект.назначить const newLion = Object.assign({ id: oldLion.id }, updated) хотите опубликовать ответ?

3. Конечно, я дам ответ в ближайшее время…

Ответ №1:

Одна из потенциальных проблем, которая может быть связана с app.put() методом, заключается в том, что при выполнении const oldLion = lions.filter((lion => lion.id === paramId)) вы получите array в качестве результата. Проверьте Array.filter() для получения дополнительной информации об этом. Итак, я полагаю, вы хотите использовать Array.find() вместо filter() , потому что позже вы вызываете:

 const newLion = Object.assign(updated, oldLion);
  

И, если oldLion это array , numeric-properties будет добавлено к updated объекту, как вы можете видеть в следующем примере:

 const updated = {somekey: "somevalue"};
console.log(Object.assign(updated, [{somekey: "updatedValue"}]));  
 .as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}  

Итак, это создает вашу неожиданную структуру, как вы упомянули:

 [
  {
    "id": "2",
    "name": "Nasus",
    "pride": "2",
    "age": "2",
    "gender": "female"
  },
  {
    "0": { // <-- This should not be here
        "id": "1",
        "name": "Teemo",
        "pride": "1",
        "age": "1",
        "gender": "female"
    },
    "age": "1",
    "gender": "female",
    "name": "LuLu",
    "pride": "LoL"
  }
]
  

Обновить

Однако, после прочтения вашего другого комментария к исправлению и понимания того, что вы пытаетесь сделать, возможно, лучше использовать Array.findIndex() и написать свой put() метод следующим образом:

 app.put('/lions/:id', function(req, res)
{
    const paramId = req.params.id;
    const updated = req.body;

    if (updated.id)
        delete updated.id;

    // Here I find the oldLion to replace by id:
    const oldLionIdx = lions.findIndex(lion => lion.id === paramId);

    if (oldLionIdx < 0)
       res.send();

    // Here I update the object with the new "lion" properties:
    const newLion = Object.assign(lions[oldLionIdx], updated);
    console.log('newLion', newLion);

    res.json(newLion);
});