javascript - 递归查找嵌套数组中的最后一个字符串?

标签 javascript arrays recursion

这些是数组:

[ 'markdown',
  [ 'para', 'this is a paragraph' ],
  [ 'para', {class: 'custom-class'}, 'another paragraph' ],
  [ 'hr' ],
  [ 'bulletlist',
    [ 'listitem', 'This is a list' ],
    [ 'listitem', 'This is another list' ] ] ]

我想要做的是找到每个字符串中的最后一个字符串。在本例中,'这是一个段落''另一个段落''这是一个列表''这是另一个列表'。 (我对只有一个字符串的数组不感兴趣,在本例中是 hr。但我想这是另一个问题。)

我能达到的最好成绩是:

for (i = 1; i < tree.length; i++) {
  var node = tree[i]
  var lastItem = node[node.length - 1] 

  console.log(lastItem)
}

\\ this is a paragraph
\\ {class: 'custom-class'}
\\ hr
\\ [ 'listitem', 'This is a list' ]
\\ [ 'listitem', 'This is another list' ]

我认为你可以看到问题,尽管 1)循环有时会找到嵌套数组/对象 2)它不是递归的。

我应该如何修改循环,以便它始终找到这些数组的最后一个字符串?

最佳答案

使用带有累加器的 reducer 和递归:

var findLast = function(xs) {
  return xs.reduce(function(acc, x) {
    if (Array.isArray(x)) {
      var last = x[x.length-1]
      if (Array.isArray(last)) {
        return acc.concat(findLast(x))
      }
      return acc.concat(last)
    }
    return acc
  },[])
}

console.log(findLast(yourArray))
/*^
[ 'this is a paragraph',
  'another paragraph',
  'hr',
  'This is a list',
  'This is another list' ]
*/

请注意,递归不是必需的,因为递归问题始终可以使用循环和堆栈(如果需要)来解决。递归更优雅,但在 JavaScript 中,它会用许多嵌套数组炸毁堆栈(直到浏览器提供 TCO),但循环不会:

var findLast = function(xs) {
  var out = []
  for (var i = 0; i < xs.length; i++) {
    var x = xs[i]
    if (Array.isArray(x)) {
      var last = x[x.length-1]
      if (Array.isArray(last)) {
        xs = x
        i = 0
      } else {
        out.push(last)
      }
    }
  }
  return out
}

这解决了您描述的一般问题,但如果您想排除具有单个元素的数组,则需要再添加一个条件:

if (Array.isArray(x) && x.length > 1) {

演示: http://jsfiddle.net/e46wnbv3/

关于javascript - 递归查找嵌套数组中的最后一个字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28925230/

相关文章:

algorithm - 动态规划找到给定序列中每个索引 j 以 Xj 结尾的所有递增子序列的数量

javascript - 如何使add(a)(b)等于a+b?

javascript - 如何从 javascript 对象获取值?

javascript - Chrome 扩展 : get current site name

c - 两个矩阵大小超过 800*800 时的段错误

java - 是什么导致了 java.lang.ArrayIndexOutOfBoundsException 以及如何防止它?

javascript - SetInterval 函数中的这个递归调用是如何工作的?

javascript - 防止刷新时调用 onbeforeunload()

javascript - 返回一个数组的函数,该数组在特定索引处具有特定顺序的数字

java - Java中使用递归分离ArrayList的偶数和奇数索引