Communities

Writing
Writing
Codidact Meta
Codidact Meta
The Great Outdoors
The Great Outdoors
Photography & Video
Photography & Video
Scientific Speculation
Scientific Speculation
Cooking
Cooking
Electrical Engineering
Electrical Engineering
Judaism
Judaism
Languages & Linguistics
Languages & Linguistics
Software Development
Software Development
Mathematics
Mathematics
Christianity
Christianity
Code Golf
Code Golf
Music
Music
Physics
Physics
Linux Systems
Linux Systems
Power Users
Power Users
Tabletop RPGs
Tabletop RPGs
tag:snake search within a tag
answers:0 unanswered questions
user:xxxx search by author id
score:0.5 posts with 0.5+ score
"snake oil" exact phrase
votes:4 posts with 4+ votes
created:<1w created < 1 week ago
post_type:xxxx type of post
Search help
Notifications
Mark all as read See all your notifications »
Q&A

How to make this treewalker code having a regular for loop or a forEach() method?

+0
−3

Credit for User:Meriton for developing the following code (first published here).

function replaceIn(e) {
  if (e.nodeType == Node.TEXT_NODE) {
    e.nodeValue = e.nodeValue.replaceAll("a", "");
  } else {
    for (const child of e.childNodes) {
      replaceIn(child);
    }
  }
}

replaceIn(document.body);

I don't want to use a for...of loop here by principle, because I personally think its syntax is confusing.

How to make this tree walker having a regular for loop instead, or, alternatively, a forEach() method instead?

Why does this post require moderator attention?
You might want to add some details to your flag.
Why should this post be closed?

0 comment threads

1 answer

+4
−0

I personally think its syntax is confusing.

Well, it's just a matter of getting used to it, I guess :-)


Anyway, this code is just looping through all childNodes and in each iteration it calls the replaceIn function, passing the element as argument.

Therefore, you could replace the for..of with a traditional for loop:

function replaceIn(e) {
  if (e.nodeType == Node.TEXT_NODE) {
    e.nodeValue = e.nodeValue.replaceAll("a", "");
  } else {
    for (let i = 0; i < e.childNodes.length; i++) {
      replaceIn(e.childNodes[i]);
    }
  }
}

Or you could use the forEach method:

function replaceIn(e) {
  if (e.nodeType == Node.TEXT_NODE) {
    e.nodeValue = e.nodeValue.replaceAll("a", "");
  } else {
    e.childNodes.forEach(replaceIn);
  }
}

With both, you achieve the same result.

Why does this post require moderator attention?
You might want to add some details to your flag.

2 comment threads

A question (6 comments)
Comments (6 comments)

Sign up to answer this question »