Javascript Exercise - 反向二维数组

rgi*_*gin 7 javascript arrays

反转可能延长n时间的二维数组的值.

[1, [2, [3, ... [n, null]]]]
Run Code Online (Sandbox Code Playgroud)

鉴于:

  1. 所有数组的长度始终为2
  2. 列表中的最后一个数组将包含一个null的索引1

例:

  • [1, [2, [3, null]]] 将输出 [3, [2, [1, null]]]
  • [1, [2, [3, [4, null]]]] 会输出 [4, [3, [2, [1, null]]]]

我不确定我是否正确描述它,但我今天遇到了这个练习,并提出了一个相当明显的解决方案.

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 );
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/5b4xntwg/

我绝不是一个javascript专家,所以我想知道是否有更好的方法来做到这一点?

JLR*_*she 8

这是一种更简洁的方法,没有副作用:

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

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

它通过以下递归调用输入[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]]])
Run Code Online (Sandbox Code Playgroud)

在最后一次调用中,arrnull(这是基本情况),所以它只返回acc,它具有值[3, [2, [1, null]]].

值得一提的是,这个嵌套数组结构基本上是一个缺点列表,在函数式编程中广泛使用,非常有利于递归操作.

最后,这是一个迭代版本:

function r(arr) {
    var acc = null;
    while (arr) { 
        acc = [arr[0], acc]; 
        arr = arr[1]; 
    }
    return acc;
}
Run Code Online (Sandbox Code Playgroud)