2016-11-14 7 views
0

Я борюсь с этой ката, которая поручает мне создать массив из вложенных в список. Я могу найти объяснения, как это сделать с помощью 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

Больно просто. Спасибо за ваш ответ. Можете ли вы подробнее рассказать о том, что скрывает указатель связанного списка, или указать мне, где я могу узнать об этом? Быстрый поиск в Google не показал многого. – 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));

Смежные вопросы