3 votes

Remplacer un objet particulier basé sur l'id dans un tableau d'objets en javascript

J'ai un tableau d'objets comme celui-ci.

var books = [{
id : 1,
name : 'Name of the wind',
year : 2015,
rating : 4.5,
author : 2}];

Maintenant j'ai une fonction editBooks qui demande à l'utilisateur un id et remplace le livre avec le même id avec les valeurs données par l'utilisateur. Par exemple

function editBooks(name,author,year,rating,id)

Comment puis-je remplacer le contenu des objets dans mon tableau de livres en fonction de l'identifiant fourni par l'utilisateur ?

3voto

Nina Scholz Points 17120

Vous pourriez chercher le id et utiliser le livre pour la mise à jour. Si aucun livre n'est trouvé, générer une nouvelle entrée.

function editBooks(name, author, year, rating, id) {
    var book = books.find(b => b.id === id);
    if (book) {
        book.name = name;
        book.author = author,
        book.year = year;
        book.rating = rating;
    } else {
        books.push({ id, name, author, year, rating });
    }
}

var books = [{ id: 1, name: 'Name of the wind', year: 2015, rating: 4.5, author: 2 }];

editBooks('Foo', 2017, 3.3, 5, 1);
editBooks('bar', 2016, 1, 2, 2);
console.log(books);

Pour une mise en œuvre légèrement meilleure, je déplacerais id à la première place des paramètres et utiliser une vérification pour tous les paramètres pour mettre à jour seulement ceux qui ne sont pas undefined en raison d'une mise à jour possible d'une seule propriété.

1voto

Nenad Vracar Points 17412

Vous pourriez passer l'objet comme paramètre à votre fonction et utiliser for...in boucle pour mettre à jour l'objet avec le même identifiant s'il est trouvé.

var books = [{id: 1,name: 'Name of the wind',year: 2015,rating: 4.5,author: 2}];

function editBooks(obj) {
  books.forEach(function(e) {
    if(obj.id && obj.id == e.id) {
      for(var i in obj) e[i] = obj[i]
    }
  })
}

editBooks({id:1, name: 'New name', author: 22})
console.log(books)

0voto

Ajay Points 1582

Essayez l'extrait ci-dessous,

function editBooks(name,author,year,rating,id) {
    var found = false;
    books.forEach(function(book) {
        if(book.id == id) {
           book.name = name;
           book.year = year ;
           book.author = author;
           book.rating = rating;
           found = true;
        }
   });
   return found; // if found is false, then you can insert new book
}

0voto

Redu Points 11722

Il est préférable de passer un objet qui ne contient que les modifications (un objet avec seulement la ou les propriétés dont les valeurs doivent être modifiées)

En général, vous pouvez simplement procéder comme suit ;

var books = [{id : 1, name : 'Name of the wind', year : 2015, rating : 4.5, author : 2}, {id : 2, name : 'River Guard', year : 2016, rating : 6.5, author : "John Doe"}];
Object.assign(books.find(b => b.id === 2),{author: "Jane Doe"});
console.log(books);

Se transformer en une fonction comme

function editBook(bookList, id, edits){
  Object.assign(bookList.find(b => b.id === id),edits);
  return bookList;
}

est trivial.

0voto

Rick Points 769
  1. Seules les valeurs modifiées sont mises à jour.

  2. Les nouveaux livres seront ajoutés si leurs identifiants n'existent pas, et si le nouveau livre a le statut valeurs non définies, ces valeurs sont définies comme non définies.

    var books = [ { id : 1, name : 'Name of the wind', year : 2015, rating : 4.5, author : 2}, {id:2, name : 'Name of the 2', year : 2015, rating : 4.5, author : 2}, {id:3, name : 'Name of the 3', year : 2015, rating : 4.5, author : 2} ];

    function editBooks(books,id,name,year,rating,author){ const update = book => Object.assign(book, { id:book.id,name: name || book.name,year: year || book.year,rating: rating || book.rating,author: author || book.author}); let details = books.find((book)=>{ return book.id===id }); details ? update(details):books.push({id,name ,year,rating, author}); };

    //edit if exists editBooks(books,2,'Updated Title','1985'); // add if id does not exist editBooks(books,4,'A Whole New Title', 2015 ); console.log(books)

    .as-console-wrapper { max-height: 100% !important; top: 0; }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X