2016-11-14 216 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));