2015-06-01 36 views
5

Tôi đang cố gắng làm phẳng mảng lồng nhau trong khi vẫn giữ thứ tự, ví dụ: [[1, 2], 3, [4, [[5]]]] phải được chuyển đổi thành [1, 2, 3, 4, 5].Làm phẳng mảng lồng nhau bằng cách sử dụng đệ quy trong JavaScript

Tôi đang cố gắng sử dụng đệ quy để làm như vậy, nhưng mã bên dưới không hoạt động và tôi không hiểu tại sao. Tôi biết có những phương pháp khác để làm điều đó, nhưng tôi muốn biết có gì sai với điều này.

function flatten (arr) { 
    var newArr = []; 
    for (var i = 0; i < arr.length; i++) { 
    if (Array.isArray(arr[i])) { 
     flatten(arr); 
    } else { 
     newArr.push(arr[i]); 
    } 
    } 
    return newArr; 
} 

flatten([[1, 2], 3, [4, [[5]]]]); 

Cảm ơn

+5

Chức năng của bộ điều khiển hơi nước là gì? – AnthonyDJ

+0

Xin lỗi, đó là một trong những thách thức của freecodecamp và tôi đã đổi tên cho một cái gì đó mang tính mô tả hơn, nhưng tôi quên điều đó. Đó không phải là vấn đề mặc dù. – user1576121

Trả lời

10

Khi gọi flatten đệ quy, bạn cần phải vượt qua arr[i] để nó và sau đó concat kết quả với newArr. Vì vậy, thay thế dòng này:

flatten(arr); 

với:

newArr = newArr.concat(flatten(arr[i])); 
+0

Ah, cảm ơn, bây giờ tôi cảm thấy như một thằng ngốc. – user1576121

1

Dưới đây là một số mã làm việc

function flatten (arr) { 
 
    var newArr = []; 
 
    for (var i = 0; i < arr.length; i++) { 
 
    if (Array.isArray(arr[i])) { 
 
     var temp = flatten(arr[i]); 
 
     temp.forEach(function(value){ newArr.push(value); }) 
 
    } else { 
 
     newArr.push(arr[i]); 
 
    } 
 
    } 
 
    return newArr; 
 
}

1

havent thử nghiệm nó, cắn phần này

if (Array.isArray(arr[i])) { 
     flatten(arr); 
    } else { 

vẻ được dự định như

if (Array.isArray(arr[i])) { 
    flatten(arr[i]); 
} else { 
+0

Sự khác biệt ở đâu? – Bergi

+0

@Bergi khác biệt là khi chuyển [i] thay vì a. Nhưng một điều thiếu ở đây - OrenD đã đề cập là ghép nối các kết quả – edmarisov

+0

Ah, bạn nên nói rõ ràng trong câu trả lời của bạn. Tôi chỉ phát hiện sự thụt đầu thay đổi. – Bergi

3

Dưới đây là một mô hình phổ biến mà tôi thường xuyên sử dụng để làm phẳng các mảng lồng nhau, và trong đó tôi thấy sạch sẽ hơn một chút do bản chất lập trình chức năng của nó:

var flatten = (arrayOfArrays) => 
    arrayOfArrays.reduce((flattened, item) => 
     flattened.concat(Array.isArray(item) ? flatten(item) : [item]), []); 

Hoặc đối với những người thích phiên bản ngắn hơn, ít dễ đọc hơn đối với chơi gôn mã hoặc như vậy:

var flatten=a=>a.reduce((f,i)=>f.concat(Array.isArray(i)?flatten(i):[i]),[]); 
+0

Dòng 'Array.isArray (mục)? flatten (item): [item] ':' [item] 'nên là' item' => 'Array.isArray (mục)? flatten (item): item' –

Các vấn đề liên quan