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 ()
函数返回的值,但它不会发生,为什么?
答案 0 :(得分:1)
目前的流程如下:
_Obj
被称为_Obj
自称_Obj
调用_assign _assign
返回值_Obj
返回_assign
_Obj
没有返回_Obj
返回的值(此处丢失的值)因此,你也应该在那里添加一个回报。
示例:
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']
]
]));
备注:强>
自0 % 2 = 0
以来,使用if (index % 2 === 0 || index === 0)
是多余的。只需使用
if (index % 2 == 0)
即可。
您最好在_assign
之外定义_Obj
,因为根据您的代码当前结构的方式,_assign
会在_Obj
的每次调用中一次又一次地定义{1}}。
使用cur => { return (cur instanceof Array) }
是不必要的冗长。您可以改为编写cur => cur instanceof Array
。