为什么期望值不归还?

时间:2017-12-28 14:35:55

标签: javascript

async completeAuthenticationAsync() {
    // complete login, get tokens etc...
    this.user = await this.manager.signinRedirectCallback();
    this.emitState();
    // check for previously saved URI
    var redirect = sessionStorage.getItem("auth:redirect");
    if(redirect){
        // redirect to route - this is using the angular router
        sessionStorage.removeItem("auth:redirect")
        this.router.navigate([redirect]);
    }
    else {
        // redirect to start page
        this.router.navigate([""]);
    }
}

我正在删除嵌套数组,但是没有返回期望值(没有数组的数组),但为什么呢?如果我返回的是function _Obj(arr) { if(arr.filter( cur => { return (cur instanceof Array) }).length === 0) { return _assign(arr); // Here i try return the result } else { _Obj(Array.prototype.concat.apply([], arr)); } function _assign(e) { var r = {}; e.forEach((cur, index, arr) => { if(index%2 === 0 || index === 0) r[cur] = arr[index + 1]; }); console.log(r) // This is the result, this should be returned return r; // the result } } var data = [ [ ['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk'] ] ]; console.log(_Obj(data));函数返回的内容,那么我就知道我失败了。

我需要返回返回 _assign的函数的值,但是不会返回它,结果也是正确的,我用_assign ()检查它,那么错误是什么?

我不是指算法本身,我的意思是函数console.log ()应该返回_Obj ()函数返回的值,但它不会发生,为什么?

2 个答案:

答案 0 :(得分:1)

目前的流程如下:

  1. _Obj被称为
  2. _Obj自称
  3. _Obj调用_assign
  4. _assign返回值
  5. _Obj返回_assign
  6. 返回的值
  7. _Obj没有返回_Obj返回的值(此处丢失的值)
  8. 因此,你也应该在那里添加一个回报。

    示例:

    
    
    function _Obj(arr) {
      if(arr.filter( function(cur) {
        return (cur instanceof Array)
      }).length === 0) {
        return  _assign(arr);
      } else {
        return _Obj(Array.prototype.concat.apply([], arr)); //Must return here also
      }
    
       function _assign(e) {
         var r = {};
         e.forEach(function(cur, index, arr) {
           if(index%2 === 0 || index === 0) r[cur] = arr[index + 1];
         });
         return r;
       }
     }
    
    var data = [
       [
        ['firstName', 'Joe'], 
        ['lastName', 'Blow'], 
        ['age', 42], 
        ['role', 'clerk']
       ]
    ];
    
    console.log(_Obj(data));
    
    
    

答案 1 :(得分:1)

@Mt. Schneiders的答案几乎涵盖了代码失败的主要原因。

简单地说,如果你没有返回在递归函数的每次迭代中得到的中间值,那么这些值就会丢失。

以下伪代码类似于递归函数如何对给定示例起作用,并且应该有助于清除问题发生的原因:

_Obj [
    _Obj [
       return _assign
    ]
]

在上文中,函数_Obj调用_Obj,后者又调用函数_assign。由于返回_assign的值,因此内部_Obj的值现在等于该值。但是,_Obj外部的值为undefined,因为内部_Obj没有返回任何内容。

为了使_Obj按预期运行,伪代码应如下所示:

_Obj [
    return _Obj [
       return _assign
    ]
]

现在,由于返回了内部_Obj的值,因此记录到控制台的最终值是_assign的值。

下面,我提供了一个更清晰,更清晰的正确代码版本。

<强>段:

function _assign (array) {
  /* Create an object. */
  var object = {};

  /* Iteratew over every element in the array. */
  array.forEach(function(element, index) {
    /* Check if the index is even. */
    if (index % 2 == 0) object[element] = array[index + 1];
  });

  /* Return the object. */
  return object;
}

function _Obj(array) {
  /* Filter the array. */
  var filtered = array.filter(current => current instanceof Array);

  /* Call either _assign or _Obj and return its value. */
  return (filtered.length === 0) ? _assign(array) : _Obj([].concat.apply([], array));
}


/* Example. */
console.log(_Obj([
  [
    ['firstName', 'Joe'],
    ['lastName', 'Blow'],
    ['age', 42],
    ['role', 'clerk']
  ]
]));

备注:

  1. 0 % 2 = 0以来,使用if (index % 2 === 0 || index === 0)是多余的。只需使用
    if (index % 2 == 0)即可。

  2. 您最好在_assign之外定义_Obj,因为根据您的代码当前结构的方式,_assign会在_Obj的每次调用中一次又一次地定义{1}}。

  3. 使用cur => { return (cur instanceof Array) }是不必要的冗长。您可以改为编写cur => cur instanceof Array