【问题标题】:Reach nested array item using recursion - javascript使用递归到达嵌套数组项 - javascript
【发布时间】:2013-09-28 20:21:35
【问题描述】:

我正在尝试使用递归到达嵌套数组的中心。这是我试图解决的一个更大问题的一部分。我确信解决方案有点初级。我一直在学习 JS/web 开发,但我很难过。

这是我的代码:

var j = [[[["hey!"]]]];

function getNested(obj) {
for (var i = 0; i < obj.length; i++) {
    if (Array.isArray(obj[i])) {
        obj = obj[i];
        getNested(obj);
    } 
    return obj[i];
  } 
}

该函数应该返回“嘿!”字符串,但我似乎无法正确。

【问题讨论】:

  • 如果你只能找到第一个最里面的嵌套元素并返回它,为什么会有for 循环?你的代码是如何递归的?
  • 如果嵌套数组中有多个元素怎么办?
  • 我没有看到getNested调用自己的地方,无论是直接调用还是通过相互递归。
  • 什么是findType?如果您正在寻找递归,请将该行换成return getNested(obj)
  • 我在你的代码中看不到递归。 getNested() 应该在某个地方调用自己。例如,如果您的数组看起来像 ["hey1",[[["hey!", "hey2"]]]] 怎么办?应该返回什么?

标签: javascript recursion


【解决方案1】:

您已经很接近了,只需将findType(obj) 换成return getNested(obj[i])。这将为您提供一个递归函数,该函数深入到数组中,直到数组中的项目 不是 另一个数组。此外,鉴于您的示例输入,for 循环是不必要的。

在您的嵌套数组恰好有一个元素时才有效。其他人已经在 cmets 中表达了这一点。

var j = [[[["hey!"]]]];

function getNested(obj) {
    if (Array.isArray(obj)) {
        return getNested(obj[0]);
    } 
    return obj;
}

var str = getNested(j);
console.log(str); // "hey!"

jsFiddle Demo

【讨论】:

    【解决方案2】:

    不需要递归,一个简单的while循环就可以解决问题

    var j = [[[["hey!"]]]];
    
    function getNested(obj) {
        while (Array.isArray(obj)) { obj = obj[0]; } 
        return obj;
    }
    
    var str = getNested(j);
    console.log(str); // "hey!"
    

    递归实现有一个很好的特性,它是纯函数式的,但如果你像这样重写它:

    var j = [[[["hey!"]]]];
    
    function getNested(obj) {
        return Array.isArray(obj)? getNested(obj[0]): obj;
    }
    
    var str = getNested(j);
    console.log(str); // "hey!"
    

    但它的性能还是会更差。

    【讨论】:

    • 它使用循环而不是递归。因此,对于深度嵌套的数组,它应该表现得更好。
    • 也许你应该写没有必要递归
    • 递归解决方案的唯一优点是它可以以更压缩的方式编写,如下所示: function getNested(obj) { return Array.isArray(obj)? getNested(obj[0]): 对象; } 但它的性能会更差。
    猜你喜欢
    • 2020-07-15
    • 2015-08-15
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    相关资源
    最近更新 更多