2015-03-31 2 views
1

Я хочу создать функцию в Javascript, которая принимает массив как аргумент и возвращает список объектов. У меня есть массив как это:Создание рекурсивного списка объектов

var arr= [10,20,30]; 
console.log(listFunction(arr)); 

Результат должен выглядеть следующим образом:

{'val':10, 'restList':{'val':20, 'restList':{'val':30,'restList':'null'}}} 

Я пробовал функцию Foreach():

function listFunction(parentArr) { 
    var listOfObjects = []; 
    parentArr.forEach(function (entry, thisArg) { 
     var singleObj = {} 
     singleObj['val'] = entry; 
     singleObj['restList'] = singleObj; 
     listOfObjects[thisArg] = singleObj; 
    }); 
    return listOfObjects; 
}; 
+0

Как Linked-List или функциональный Lisp-подобный список? – ryanyuyu

+0

@ryanyuyu список узлов и преемников. yes like Linked-list –

+0

Было бы проще, если бы внутреннее большинство 'restList' должно быть' {} 'вместо' null'. –

ответ

4

Вы должны использовать рекурсивный функции:

function listFunction(arr){ 

    if(arr.length == 0){ 
     return null; 
    }else{ 
     return {val: arr[0], restList: listFunction(arr.slice(1,arr.length))}; 
    } 
} 
+0

Спасибо, за быстрый ответ, но я хочу сделать это без фрагмента .. –

+0

Вы можете отправить следующую позицию массива. Но вам нужно создать еще одну функцию. function listFunction (arr, index) ... И вам нужно увеличить индекс на каждом шаге. – aabadia

+0

Это работает очень хорошо. Почему не 'slice' вариант? –

0

Это алгоритм рекурсивного списка в стиле Lisp.

var recursiveList = function (array) { 
    return recursiveListHelper(arr, {}); 
}; 

var recursiveListHelper = function (array, obj) { 
    if (array.length === 0) //stopping condition 
    return null; 

    var car = array[0];  //current element 
    var cdr = array.slice(1); //rest of list 
    obj = {val: car}; 
    obj.restList = recursiveListHelper(cdr, obj); 
    return obj; 
}; 

Вы упомянули, что хотите избежать использования Array.slice. Это решение использует индексацию массива вместо разделения на подмассивы.

var recursiveIndexed = function (array) { 
    return recursiveIndexedHelper(array, {}, 0); 
}; 

var recursiveIndexedHelper = function (array, obj, index) { 
    if (index == array.length) 
    return null; 

    var car = array[index]; 
    obj = {val: car }; 
    obj.restList = recursiveIndexedHelper(array, obj, index + 1); 
    return obj; 
}; 

A plunker как пример.

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