7

You can use array for replacement:

var array = {"from1":"to1", "from2":"to2"}

for (var val in array)
    text = text.replace(array, array[val]);

But what if you need to replace globally, ie text = text.replace(/from/g, "to");

Array is pretty big, so script will take a lot of space if I write "text = text.replace(...)" for every variable.

How can you use array in that case? "/from1/g":"to1" does not working.

2
  • 2
    Your array is actually an Object object, not an Array object, even if it can be considered as an associative array :) Commented Nov 27, 2011 at 12:43
  • Does this answer your question? Replace multiple strings at once Commented Oct 28, 2020 at 22:18

3 Answers 3

7
var array = {"from1":"to1", "from2":"to2"}

for (var val in array)
    text = text.replace(new RegExp(val, "g"), array[val]);

Edit: As Andy said, you may have to escape the special characters using a script like this one.

Sign up to request clarification or add additional context in comments.

2 Comments

If the string could contain regexp special characters, don't forget to correctly escape them.
This and the other two solutions on this page work for some cases, but have various issues, including cumulative replacement (which allows replacement strings to be replaced) and breakage from inputs with special characters. Here is a more robust solution.
3

Here is my solution, assuming the string keys in array need not to be escaped.

It is particularly efficient when the object array is large:

var re = new RegExp(Object.keys(array).join("|"), "g");
var replacer = function (val) { return array[val]; };
text = text.replace(re, replacer);

Note this requires the Object.keys method to be available, but you can easily shim it if it is not.

Comments

1

Here's the idiom for simple, non-RegExp-based string replace in JS, so you don't need to worry about regex-special characters:

for (var val in array)
    text= text.split(val).join(array[val]);

Note there are issues with using an Object as a general purpose lookup. If someone's monkeyed with the Object prototype (bad idea, but some libraries do it) you can get more val​s than you wanted; you can use a hasOwnProperty test to avoid that. Plus in IE if your string happens to clash with a method of Object such as toString, IE will mysteriously hide it.

For your example here you're OK, but as a general case where the strings can be anything, you'd need to work around it, either by processing the key strings to avoid clashes, or by using a different data structure such as an Array of [find, replace] Arrays.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.