var person = { name:'asdfds', key:1 } person.next = person;¿Cómo solucionar esta redundancia cíclica en javascript?
Como se menciona en el comentario, puede verificar la referencia circular con el operador === , el siguiente código se evalúa como verdadero:
var person = { name:'asdfds', key:1 } person.next = person; if(person.next === person) { console.log('It is the same object.') } else { console.log('it is not the same.') } Con esta información dada, puede evitar bucles interminables manteniendo una array de references a los objetos que ya ha recorrido.
function loopThroughObject(obj, references = []) { // store the reference to this object!. references.push(obj) Object.keys(obj).forEach(k => { const val = obj[k] if (typeof val === 'object') { if (references.includes(val)) { console.log('circular reference found.. stop loop') return } else { // iterate through the object once!. // pass the references array aswell. loopThroughObject(val, references) } } else { // the value found under key is not an object and "unique", do something with it! console.log(`Found a value:`, val) } }) } /// Some test data. const innerObj = { innerName: 'innerName', key: 3 } const person = { name: 'asdfw', key: 1, innerObj: innerObj } person.next = person person.innerObj.circular = person person.innerObj.veryCircular = innerObj person.innerObj.otherCircularPerson = person // This should now print every primitive value only once. loopThroughObject(person) Esto le da la salida deseada de cada valor primitive una vez:
Found a value: asdfw Found a value: 1 Found a value: innerName Found a value: 3