我正在嘗試撰寫一個函式,其中該函式回傳陣列中物件中名稱和年齡鍵/值對的子陣列。我將使用遞回來實作它,但是我找不到不涉及將numandarr2變數保留在函式之外的解決方案(因為當它們在函式內部時,每個回圈都默認為零/空)。
我在控制臺中進行了很好的測驗,但是對于不同的陣列,我回傳未定義
我也不確定我的遞回函式呼叫是否在正確的位置。任何提示或指示將不勝感激!
var arr =[
{name:'mike', age:22},
{name:'robert', age:12},
{name:'roger', age:44},
{name:'peter', age:28},
{name:'Ralph', age:67}
]
var arr2 = []
var num = 0;
function recursive (arr) {
if (num < arr.length ) {
debugger
arr2.push([arr[num].name, arr[num].age])
num ;
recursive(arr)
}
else if (num === arr.length) {
return arr2;
}
}
這是我想要的輸出:
[[ mike, 22],
[ robert, 12],
[ roger, 44],
[ peter, 28],
[ ralph, 67]]
uj5u.com熱心網友回復:
為避免使用全域變數,您需要確保您的函式始終回傳結果。在if塊中,這沒有發生。進行了遞回呼叫,但即使它會回傳某些內容,該回傳值也會被忽略,之后不會回傳任何內容。
您還可以num通過給遞回呼叫一個排序器陣列(它的一部分,不包括已處理的值)來避免該變數。
以下是如何使它與遞回函式一起作業:
function createPairs([first, ...rest]) {
if (first === undefined) return []; // base case
return [[first.name, first.age], ...createPairs(rest)];
}
var arr =[{name:'mike', age:22},{name:'robert', age:12},{name:'roger', age:44},{name:'peter', age:28},{name:'Ralph', age:67}];
console.log(createPairs(arr));
或者,您可以將num索引作為第二個引數傳遞,并將其默認值為 0,這樣初始呼叫就不必知道它(我將i在這里呼叫它):
function createPairs(arr, i=0) {
if (i >= arr.length) return []; // base case
return [[arr[i].name, arr[i].age], ...createPairs(arr, i 1)];
}
var arr =[{name:'mike', age:22},{name:'robert', age:12},{name:'roger', age:44},{name:'peter', age:28},{name:'Ralph', age:67}];
console.log(createPairs(arr));
另一個版本仍然避免每次遞回呼叫回傳時創建新陣列。我們可以將當前值轉移到回傳的陣列中。或者更好的是,使索引向后移動,因此陣列是從左到右構建的:
function createPairs(arr, i=arr.length-1) {
if (i < 0) return []; // base case
const result = createPairs(arr, i-1);
result.push([arr[i].name, arr[i].age]);
return result;
}
var arr =[{name:'mike', age:22},{name:'robert', age:12},{name:'roger', age:44},{name:'peter', age:28},{name:'Ralph', age:67}];
console.log(createPairs(arr));
請注意,這里并不真正建議遞回。迭代解決方案更適合此問題。
function createPairs(arr) {
return arr.map(({name, age}) => [name, age]);
}
var arr =[{name:'mike', age:22},{name:'robert', age:12},{name:'roger', age:44},{name:'peter', age:28},{name:'Ralph', age:67}];
console.log(createPairs(arr));
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/490546.html
標籤:javascript 递归
