0
var person = {
    name:'asdfds',
    key:1
}

person.next = person;

How to fix this cyclic redundancy in javascript?

Madhu
  • 132
  • 3
  • 10
  • 1
    What do you mean by `fix this` ? Circular reference is possible and if you assign the same object within itself then it is your code thath should not do it right? You can always check if it is the same by doing `if(person.next === person) { console.log("it's the same..") }` – Silvan Bregy Feb 17 '22 at 15:15
  • if you want to have a cyclic depedancy use a getter inside object – cmgchess Feb 17 '22 at 15:17
  • for example if i have a function which loop through the person object and based on some condition i will call the function again. recursive function. in this case the function will call endlessly. so for that how can i fix it – Madhu Feb 17 '22 at 15:18

1 Answers1

0

As mentioned in the comment, you can check circular reference with === operator, following code evaluates to true:

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.')
}

With this given information you can avoid looping endlessly by holding an array of references to the objects you have already looped through.


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)

This gives you the desired output of every primitive value once:

Found a value: asdfw
Found a value: 1
Found a value: innerName
Found a value: 3

Silvan Bregy
  • 2,544
  • 1
  • 8
  • 21