web-dev-qa-db-fra.com

Mettre à jour la valeur d'attribut d'un objet à l'aide de la fonction map dans ES6

J'essaye de coder ceci dans ES6. Voici ce que j'essaie de réaliser. Disons que j'ai un tableau d'objets appelé schools.

let schools = [
    {name: 'YorkTown', country: 'Spain'},
    {name: 'Stanford', country: 'USA'},
    {name: 'Gymnasium Achern', country: 'Germany'}
];

Maintenant, je veux écrire une fonction appelée editSchoolName qui prendra 3 paramètres, schools (qui est le tableau que j'ai défini ci-dessus), oldName et name.

Je vais passer le nom de l'école dans le paramètre oldName et ce nom devrait être mis à jour avec la valeur dans le paramètre name

Je ne veux pas changer l'état de la variable schools, alors j'utilise une fonction map qui retournera un nouveau tableau avec les modifications.

La fonction editSchoolName s'appellera comme ceci -

var updatedSchools = editSchoolName(schools, "YorkTown", "New Gen");

Ici, le nom YorkTown doit être remplacé par le nom New Gen. Donc, la valeur attendue du tableau updatedSchools devrait être -

let updatedSchools = [
    {name: 'New Gen', country: 'Spain'},
    {name: 'Stanford', country: 'USA'},
    {name: 'Gymnasium Achern', country: 'Germany'}
];

Voici à quoi ressemble ma fonction editSchoolName -

const editSchoolName = (schools, oldName, name) =>
    schools.map(item => {
        if (item.name === oldName) {
          /* This is the part where I need the logic */
        } else {
          return item;
        }
    });

Vous avez besoin d’aide pour modifier la fonction editSchoolName afin d’obtenir le résultat souhaité mentionné ci-dessus.

2
Rito

essayez ceci, ES6 Object.assign() pour créer une copie d’un élément de tableau et mettre à jour un nouvel objet.

let schools = [{
        name: 'YorkTown',
        country: 'Spain'
    },
    {
        name: 'Stanford',
        country: 'USA'
    },
    {
        name: 'Gymnasium Achern',
        country: 'Germany'
    }
];

const editSchoolName = (schools, oldName, name) => {
    return schools.map(item => {
        var temp = Object.assign({}, item);
        if (temp.name === oldName) {
            temp.name = name;
        }
        return temp;
    });
}

var updatedSchools = editSchoolName(schools, "YorkTown", "New Gen");
console.log(updatedSchools);
console.log(schools);

1
Rahul Sharma

Vous devez retourner l'objet mis à jour:

const editSchoolName = (schools, oldName, name) =>
  schools.map(item => {
      if (item.name === oldName) {
        return {...item, name};
      } else {
        return item;
      }
});
2
klugjo
   const editSchoolName = (schools, oldName, newName) =>
    schools.map(({name, ...school }) => ({ ...school, name: oldName === name ? newName : name }));

Vous pouvez le raccourcir en utilisant un ternaire.

2
Jonas Wilms

Si vous souhaitez modifier uniquement la partie commentée:

const editSchoolName = (schools, oldName, name) =>
    schools.map(item => {
        if (item.name === oldName) {
          var newItem = Object.assign({},item);
          newItem.name = name;
          return newItem;
        }
        else{
          return item;
        }
    });
1
Anurag Lal

Je me demande pourquoi aucune des réponses ne donne une solution simple

const editSchoolName = (schools, oldName, newName) =>
      schools.map(school => { if (school.name === oldName) school.name = newName;
      return school; 
});
0
Sumer