Ich versuche, ein JS-Objekt mit einem anderen Objekt zu aktualisieren, was trivial erscheint, aber der Wert wird nicht aktualisiert.

let sampleObj = {
  id: 1,
  name: 'Kelly'
}

let userData = [{
    students: [{
      id: 1,
      name: 'Sandra'
    }]
  },
  {
    students: [{
      id: 2,
      name: 'Jerome'
    }]
  }
]

for (let group of userData) {
  for (let student of group.students) {
    if (student.id === sampleObj.id) {
      console.log('updating student object')
      student = sampleObj

      // student = { ...sampleObj }     (another failed attempt)
      // userData[group].students[student] = sampleObj     (another failed attempt)
    }
  }
}

console.log('userData', userData)

Es scheint, dass student nur eine schwebende Sache ist, die an dem Punkt, an dem ich versuche, ihren Wert zu aktualisieren, nicht mit userData verknüpft ist. Ich kann jedoch nicht herausfinden, wie das Update durchgeführt werden soll oder was mir fehlt.

BEARBEITEN: Die erwartete Ausgabe besteht darin, das student Objekt durch sampleObj zu ersetzen, sobald es gefunden wurde.

1
bruh 18 Jän. 2019 im 03:31

3 Antworten

Beste Antwort

Verwenden Sie stattdessen forEach(el, index), damit der Index für das Update verfügbar ist:

let sampleObj = {
  id: 1,
  name: 'Kelly'
}

let userData = [{
    students: [{
      id: 1,
      name: 'Sandra'
    }]
  },
  {
    students: [{
      id: 2,
      name: 'Jerome'
    }]
  }
]

userData.forEach((group, m) => {
  group.students.forEach((student, n) => {
    if (student.id === sampleObj.id) {
      console.log('updating student object')
      userData[m].students[n] = sampleObj
    }
  })
})

console.log('userData', userData)
4
connexo 18 Jän. 2019 im 00:40

Sie aktualisieren niemals das aktuelle userData. Um es zu aktualisieren, sollten Sie auf das userData -Objekt in der Schleife verweisen, nicht auf die temporäre Variable, die zum Iterieren des Objekts verwendet wird.

Versuchen Sie also etwas wie:

let sampleObj = { id: 1, name: 'Kelly' }

let userData = [
    {
    students: [
        { id: 1, name: 'Sandra' }
    ]
  },
  {
    students: [
        { id: 2, name: 'Jerome' }
    ]
  }
]
let j=0
for ( let group of userData ) {let i=0
    for ( let student of group.students ) { 
    if ( student.id === sampleObj.id ) {
        console.log('updating student object')
        userData[j].students[i] = sampleObj

      // student = { ...sampleObj }     (another failed attempt)
      // userData[group].students[student] = sampleObj     (another failed attempt)
    } i++;
  } j++;
}

console.log('userData', userData)
1
Nishanth Matha 18 Jän. 2019 im 00:42

Das Ersetzen von Array-Elementen funktioniert auf diese Weise nicht. Stattdessen können Sie die Eigenschaften des Schülerobjekts wie folgt ersetzen

for (let group of userData) {
  for (let student of group.students) {
    if (student.id === sampleObj.id) {
      console.log('updating student object')
      student = Object.assign(student, sampleObj);
    }
  }
}

Es werden alle Eigenschaften von samplObj dem Schülerobjekt zugewiesen.

3
Kabir 18 Jän. 2019 im 04:27