'Recursive map function for nested array

I'm trying to create a map function that supports computing nested arrays, using recursion:

This function, when a unidimesional (eg. [1,2,3,4] ) array is used works fine:

const map = (oldArray, callback, newArray = []) => {

    //base case: check if there are any items left in the original array to process
    if (oldArray.length <= 0){
      //if all items have been processed return the new array
      return newArray
    } else {
      //destructure the first item from old array and put remaining in a separate array
      const [item, ...theRest] = oldArray
      // create an array of the current new array and the result of the current item and the callback function
      const interimArray = [...newArray, callback(item)]
      // return a recursive call to to map to process the next item.
      return map(theRest, callback, interimArray)
    }

  }

But, I want to support a nested array, so for example, I have an array like this:

const array = [1,[1,2],3]

and I want to apply a function, eg: (x)=>x+1;

I have this implementation so far, but I can't wrap my mind around it.

function rnMap(oldArr, fn, newArr = []) {
  const [item, ...rest] = oldArr;

  if (oldArr.length <= 0) {
    return newArr;
  } else if (Array.isArray(item)) {
    return rnMap(item, fn, [...newArr, rnMap(item, fn, [])]);
  } else {
    const interimArray = [...newArr, fn(item)];

    return rnMap(rest, fn, interimArray);
  }
}

const rnRes = rnMap(nArr, (e) => {
  return e + 1;
});

console.log(rnRes);

It returns [ 2, [ 2, 2 ], 2, 2 ] but it suppose to return [2,[2,3],4]

If anyone could help me will be appretiated. Thanks in advance.



Solution 1:[1]

No loop approach, sort of ...

const
    map = ([value, ...array], fn) => {
        if (value === undefined) return [];
        return [
            (Array.isArray(value) ? map(value, fn) : fn(value)),
            ...map(array, fn)
        ];
    },
    array = [1, [1, 2], 3],
    fn = x => x + 1;

console.log(map(array, fn));

Solution 2:[2]

Finally I found the error, here is my solution:

function rnMap(oldArr, fn, newArr = []) {
  const [item, ...rest] = oldArr;

  if (oldArr.length <= 0) {
    return newArr;
  } else if (Array.isArray(item)) {
    return rnMap(rest, fn, [...newArr, rnMap(item, fn, [])]);
  } else {
    return rnMap(rest, fn, [...newArr, fn(item)]);
  }
}

const rnRes = rnMap([1, 2, [3, 4, [5, 6]], 7], (e) => {
  return e + 1;
});

console.log(rnRes);

Solution 3:[3]

This would probably be the simplest solution.

// @ts-ignore
const func = (list: Array<any>) => {
    return list.map(i => {
        if (i instanceof Array) {
            return func(i)
        }

        return i+1
    })
}

const result = func([1,[1,2],3])
console.log('log result', result)

This is in typescript, let me know if you want a js version

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 user1252306
Solution 3 Saahithyan Vigneswaran