Javascript 创建对象的递归列表

Javascript 创建对象的递归列表,javascript,arrays,object,Javascript,Arrays,Object,我想在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 l

我想在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;
};
function listFunction(arr){

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

您需要使用递归函数:

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

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

您需要使用递归函数:

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

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

这是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;
};

例如。

这是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;
};

例如。

像链表还是像函数Lisp一样的列表?@ryanyyu节点和后续节点的列表。是的,就像链接列表如果最里面的restList应该是{}而不是null会更容易。像链接列表或函数Lisp-like列表?@ryanyyu节点和后续节点的列表。是的,就像链接列表一样,如果最里面的restList应该是{}而不是null,那么会更容易。您可以发送数组的下一个位置。但您需要创建另一个函数。函数列表FunctionRR,索引。。。您需要在每个步骤中增加索引。快速注意:切片函数中不需要arr.length。如果缺少第二个参数,则默认为数组的长度。您可以发送数组的下一个位置。但您需要创建另一个函数。函数列表FunctionRR,索引。。。您需要在每个步骤中增加索引。快速注意:切片函数中不需要arr.length。如果缺少第二个参数,则默认为数组的长度。