2016-12-02 21 views
2

自從我開始編程以來,我似乎瞄準了全局變量,並且發現在沒有它們的情況下很難工作,並且發現在遞歸函數中特別困難。有人可以幫助我使用這段代碼來使它免於全局變量嗎?另外,有沒有可以幫助改變思維方式的參考,所以我最終並不覺得對它們有需要?我覺得代碼需要改變,但我不知道是什麼。在這段代碼中使用全局變量的最佳選擇

var res = []; 
 

 
function steamrollArray(arr) { 
 
    // I'm a steamroller, baby 
 
    func(arr); 
 
    console.log(res); 
 
    return res; 
 
} 
 

 
steamrollArray([1, {}, [3, [[4]]]]); 
 

 
function func(array){ 
 
    for (var i=0; i<array.length ; i++){ 
 
    if (Array.isArray(array[i])){ 
 
     func(array[i]); 
 
    } 
 
    else { 
 
     res.push(array[i]); 
 
    } 
 
    } 
 
}

+2

FYI,這個平常的名字是* *變平。 – Barmar

+0

剛剛從函數func()返回的值可以完成您的工作..我想 –

回答

1

可以傳遞結果數組作爲參數,因爲陣列和對象是通過在JS引用傳遞。

function steamrollArray(arr) { 
 
    // I'm a steamroller, baby 
 
    var res = []; 
 
    func(arr, res); 
 
    console.log(res); 
 
    return res; 
 
} 
 

 
steamrollArray([1, {}, [3, [[4]]]]); 
 

 
function func(array, res){ 
 
    for (var i=0; i<array.length ; i++){ 
 
    if (Array.isArray(array[i])){ 
 
     func(array[i], res); 
 
    } 
 
    else { 
 
     res.push(array[i]); 
 
    } 
 
    } 
 
}

+0

正是我正在尋找的答案,謝謝。它用最簡單的術語解釋了它,沒有改變,只是幫助我改變了我的想法。 – isam

1

的另一種方式是使用一個單一的功能,它進行迭代,並且收集的數據,並僅部分收集的數據返回。

function steamrollArray(array) { 
 
    var result = []; 
 
    for (var i = 0; i < array.length; i++) { 
 
     if (Array.isArray(array[i])) { 
 
      result = result.concat(steamrollArray(array[i])); 
 
     } else { 
 
      result.push(array[i]); 
 
     } 
 
    } 
 
    return result; 
 
} 
 

 
console.log(steamrollArray([1, {}, [3, [[4]]]]));

2

只是聲明函數內部的變量,並在年底返回。適當地處理遞歸調用。

function flatten(array){ 
 
    var res = []; 
 
    for (var item of array) { 
 
    if (Array.isArray(item)) 
 
     res.push(...flatten(item)); 
 
    else 
 
     res.push(item); 
 
    } 
 
    return res; 
 
} 
 
console.log(flatten([1, {}, [3, [[4]]]]));

這不完全一樣的代碼,但它是什麼人可能會想到。

1

你可以嵌套函數:

function steamrollArray(inputArray) { 
    var res = []; 
    var process = function(arrayToProcess){ 
    for (var i=0; i<arrayToProcess.length ; i++){ 
     if (Array.isArray(arrayToProcess[i])){ 
     process(arrayToProcess[i]); 
     } 
     else { 
     res.push(arrayToProcess[i]); 
     } 
    } 
    }; 
    process(inputArray); 
    return res; 
} 

steamrollArray([1, {}, [3, [[4]]]]); 
+0

我也喜歡這個解決方案!任何人都可以評論在這種情況下哪個更好? Nest函數或將結果作爲另一個參數發送給函數本身? – isam

1

隨着reduce的幫助和Spread operator (ES6),你甚至可以解決你的問題,沒有任何變量賦值:

function flatten(arr) { 
 
    return arr.reduce((p, c) => { 
 
    if (Array.isArray(c)) { 
 
     return [...p, ...flatten(c)]; 
 
    } 
 
    return [...p, c]; 
 
    }, []) 
 
} 
 

 
console.log(flatten([1, {}, [3, [[4]]]]));

1

好,這裏是真正的遞歸:

console.log(f([1, {}, [3, [[4]]]])); 
 

 
function f(xs){ 
 
  if (xs.length === 0) return xs; 
 

 
  return (Array.isArray(xs[0]) ? f(xs[0]) : [xs[0]]).concat(f(xs.splice(1))); 
 
}

相關問題