Andreas Köberle
Andreas Köberle

Reputation: 110922

Replace in array using lodash

Is there an easy way to replace all appearances of an primitive in an array with another one. So that ['a', 'b', 'a', 'c'] would become ['x', 'b', 'x', 'c'] when replacing a with x. I'm aware that this can be done with a map function, but I wonder if have overlooked a simpler way.

Upvotes: 9

Views: 19810

Answers (5)

Aakash
Aakash

Reputation: 23737

A replace method like this one could work:

const replacer = (contextArray, itemToReplace, replaceWith) => _.map(
  contextArray,
  (n) => n === itemToReplace ? replaceWith : n
)
console.log(replacer(['a', 'b', 'a', 'c'], "a", "x"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.19/lodash.min.js"></script>

Upvotes: 0

j1s
j1s

Reputation: 190

If the array contains mutable objects, It's straightforward with lodash's find function.

  var arr = [{'a':'a'}, {'b':'b'},{'a':'a'},{'c':'c'}];    

  while(_.find(arr, {'a':'a'})){
    (_.find(arr, {'a':'a'})).a = 'x';
  }


console.log(arr); // [{'a':'x'}, {'b':'b'},{'a':'x'},{'c':'c'}]

Upvotes: 3

Ihor
Ihor

Reputation: 3809

Another simple solution. Works well with arrays of strings, replaces all the occurrences, reads well.

var arr1 = ['a', 'b', 'a', 'c'];
var arr2 = _.map(arr1, _.partial(_.replace, _, 'a', 'd'));
console.log(arr2); // ["d", "b", "d", "c"]

Upvotes: 1

Benjamin Gruenbaum
Benjamin Gruenbaum

Reputation: 276306

In the specific case of strings your example has, you can do it natively with:

myArr.join(",").replace(/a/g,"x").split(",");

Where "," is some string that doesn't appear in the array.

That said, I don't see the issue with a _.map - it sounds like the better approach since this is in fact what you're doing. You're mapping the array to itself with the value replaced.

_.map(myArr,function(el){
     return (el==='a') ? 'x' : el;
})

Upvotes: 11

Tomalak
Tomalak

Reputation: 338228

I don't know about "simpler", but you can make it reusable

function swap(ref, replacement, input) {
    return (ref === input) ? replacement : input;
}

var a = ['a', 'b', 'a', 'c'];

_.map(a, _.partial(swap, 'a', 'x'));

Upvotes: 3

Related Questions