2016-11-14 259 views
0

我正在努力與這個kata,指示我從嵌套列表中創建一個數組。我可以找到解釋如何使用Java來做到這一點,但這對我仍然有點困惑。嵌套列表到陣列

這是我這麼遠......

function listToArray(list) { 
 
    var listArray = []; 
 
    for (var i = 0; i < list.length; i++) { 
 
    listArray[i] = list.value(i); 
 
    }; 
 
    return listArray; 
 
};

測試用例...

var list1 = {value: 1, next: {value: 2, next: {value: 3, next: null}}}; 
 
var list2 = {value: "foo", next: {value: "bar", next: null}}; 
 

 
Test.assertSimilar(listToArray(list1), [1, 2, 3]); 
 
Test.assertSimilar(listToArray(list2), ["foo", "bar"]);

感謝幫助!

回答

4

這是一個簡單的鏈表指針追逐:

function listToArray(list) { 
    var listArray = []; 
    while (list !== null) { 
    listArray.push(list.value); 
    list = list.next; 
    } 
    return listArray; 
}; 
+2

痛苦地簡單。謝謝您的回答。你能解釋更多關於什麼是鏈接列表指針追蹤或指向我可以在哪裏瞭解它?快速谷歌搜索沒有顯示太多。 – wahoowa

1

遞歸就做

function listToArray(list) { 
 
    var res = []; 
 
    Object.keys(list).forEach(function(k) { 
 
    if (typeof list[k] == 'object' && list[k] !== null) 
 
     [].push.apply(res, listToArray(list[k])); 
 
    else if (list[k] !== null) 
 
     res.push(list[k]); 
 
    }); 
 
    return res; 
 
}; 
 

 
var list1 = { 
 
    value: 1, 
 
    next: { 
 
    value: 2, 
 
    next: { 
 
     value: 3, 
 
     next: null 
 
    } 
 
    } 
 
}; 
 
var list2 = { 
 
    value: "foo", 
 
    next: { 
 
    value: "bar", 
 
    next: null 
 
    } 
 
}; 
 

 
console.log(listToArray(list1)); 
 
console.log(listToArray(list2));

1

使用遞歸另一種解決方案:

var list1 = {value: 1, next: {value: 2, next: {value: 3, next: null}}}; 
 
var list2 = {value: "foo", next: {value: "bar", next: null}}; 
 

 
function convertToArray(list, result) { 
 
    result.push(list.value); 
 
    list.next && convertToArray(list.next,result); 
 
    return result; 
 
} 
 

 
console.log(convertToArray(list1,[])); 
 
console.log(convertToArray(list2,[]));

1

你必須直到到達null點深入挖掘的對象。

var list1 = {value: 1, next: {value: 2, next: {value: 3, next: null}}}; 
 
var list2 = {value: "foo", next: {value: "bar", next: null}}; 
 

 
function listToArray(list) { 
 
    var curr = list, arr = []; 
 
    while (curr != null) { 
 
    arr.push(curr.value); 
 
    curr = curr.next; 
 
    } 
 
    return arr; 
 
} 
 

 
console.log(listToArray(list1)); 
 
console.log(listToArray(list2));