【问题标题】:JavaScript changing object list to array. return undefinedJavaScript 将对象列表更改为数组。返回未定义
【发布时间】:2017-08-15 04:34:12
【问题描述】:
function listToArray(list){
    var newArray = [];
    repeat();
    function repeat(){
        newArray.push(list.value);
        if(list.rest == null){
            return obj = newArray; // I don't know why It returns undefined here
        }
        else {
        list = list.rest;
        repeat();
        }
    }
}

// and this will return an array

function reTurn(){
    var listVar = [5, 4, 3, 2, 1];
    return obj = listVar;
}

当我在控制台中查找它时,这个函数确实改变了我的 obj,但返回未定义。 任何人都可以帮助我吗?请

【问题讨论】:

  • 函数listToArray() 不会返回任何东西——只有repeat() 会。如果你想从listToArray() 中获得一些东西,你必须return repeat();

标签: javascript return


【解决方案1】:

只需return newArray - 你不能返回这样的作业。

【讨论】:

  • 你为什么不能?
【解决方案2】:

您是从内部函数返回的,而不是外部函数。在listToArray 的底部添加return newArray。将repeat 中的return 语句更改为仅return;

function listToArray(list){
    var newArray = [];
    repeat();

    function repeat(){
        newArray.push(list.value);
        if (list.rest) {
            list = list.rest;
            repeat();
        }
    }

    return newArray;
}

递归方法并没有什么问题,但这不是必需的。你可以很容易地写

function listToArray(list){
    var newArray = [];

    while (list) {
      newArray.push(list.value);
      list = list.rest;
    }

    return newArray;
}

然而,即使是这段代码也有一个缺点,就是它将列表的遍历与值数组的构建混合在一起。最好将它们分开:

function traverseList(list, fn) {
  while (list) {
    fn(list.value);
    list = list.rest);
  }
}

现在你可以把listToArray写成

function listToArray(list) {
    var newArray = [];

    traverseList(list, value => newArray.push(value));

    return newArray;
}

我也可以把它写成生成器:

function* forList(list) {
  while (list) {
    yield list.value;
    list = list.rest;
  }
}

现在我什至不需要单独的函数来创建值数组,因为我可以写

[...forList(list)]

【讨论】:

    猜你喜欢
    • 2019-12-30
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    相关资源
    最近更新 更多