8

Reverse the values of a 2 dimensional array that could extend n times.

[1, [2, [3, ... [n, null]]]]

Given:

  1. All arrays always have a length of 2
  2. Last array in the list will contain an index 1 of null

Example:

  • [1, [2, [3, null]]] will output [3, [2, [1, null]]]
  • [1, [2, [3, [4, null]]]] would output [4, [3, [2, [1, null]]]]

I'm not sure if I'm describing it right but I came across this exercise today and came up with a fairly obvious solution.

var ars = [1, [2, [3, null]]], rev = null;

function r(x) {
    rev = (rev == null) ? [x[0]] : [x[0], rev];
    if( x[1] !== null )
        r(x[1]);
}
r(ars);
console.log( rev );

http://jsfiddle.net/5b4xntwg/

I am by no means a javascript expert, so I was wondering if there was a better way to do it?

7
  • 1
    Does the array always end in a null? Also, your example seems to leave that out of the final result. Commented Aug 27, 2014 at 17:27
  • 1
    I'm not sure that "2D" and "reverse" are quite the right terms here. This is a nested array and you are, for want of a better term, turning it inside out. Commented Aug 27, 2014 at 17:31
  • This question appears to be off-topic because it belongs on codereview.stackexchange.com Commented Aug 27, 2014 at 17:33
  • @RocketHazmat- The bottom array should always end with null. Something that I missed, apparently. Commented Aug 27, 2014 at 17:33
  • @MattBurland - Yeah, I suppose you're right. Turning it inside out is more appropriate. But like I said, I really just came across this exercise today and don't really know how to describe it. (it was shown to me by a co-worker). Commented Aug 27, 2014 at 17:34

1 Answer 1

8

Here's a more concise approach that doesn't have side-effects:

function r(arr, acc) {
    acc = acc || null;
    return arr ? r(arr[1], [arr[0], acc]) : acc;
}

http://jsfiddle.net/5b4xntwg/1/

It goes through the following recursive calls for the input [1, [2, [3, null]]]:

r([1, [2, [3, null]]]                     )
r([2, [3, null]]     , [1, null]          )
r([3, null]          , [2, [1, null]]     )
r(null               , [3, [2, [1, null]]])

On the last call, arr is null (this is the base case), so it just returns acc, which has the value [3, [2, [1, null]]].

One thing worth mentioning is that this nested array structure is basically a cons list, which is used extensively in functional programming and is very conducive to recursive operations.

Lastly, here's an iterative version:

function r(arr) {
    var acc = null;
    while (arr) { 
        acc = [arr[0], acc]; 
        arr = arr[1]; 
    }
    return acc;
}
Sign up to request clarification or add additional context in comments.

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.