Eloquent Javascript:了解为什么从另一个数组中提取数组而不仅仅是值(listToArray函数)

时间:2017-09-04 23:07:45

标签: javascript arrays list object nodes

我正在通过Eloquent Javascript阅读,目前我正在进行有关阵列列表的练习,反之亦然。练习要我让控制台打印[10,20,30],但我反而打印[[10],[20],[30]]并且不确定为什么。我想你可以说它没有什么区别,但我想“p

function arrayToList(arr) {
  let obj = {};
  for(let i = 0 ; i < arr.length; i++) {
    obj.value = arr.splice(0,1);
    obj.rest = arrayToList(arr);
  }
  return obj;
};

function listToArray(list){
  let tempArray = [];
  for(var node = list; node; node = node.rest) {
    if (node.rest !== undefined){
    tempArray.push(node.value);
  	}
  }
  return tempArray;
};

console.log(listToArray(arrayToList([10, 20, 30])));

ull“数组中的值。我试图创建另一个临时数组来使用.join方法,然后将其推送到我的结果数组中,但由于某种原因,这只是给了我一个。

这是我的代码:

function arrayToList(arr) {
  let obj = {};
  for(let i = 0 ; i < arr.length; i++) {
    obj.value = arr.splice(0,1);
    obj.rest = arrayToList(arr);
  }
  return obj;
};

function listToArray(list){
  let tempArray = [];
  for(var node = list; node; node = node.rest) {
    if (node.rest !== undefined){
    tempArray.push(node.value);
    }
  }
  return tempArray;
};

console.log(listToArray(arrayToList([10, 20, 30])));

有谁可以解释这里发生的事情?

2 个答案:

答案 0 :(得分:0)

当你使用'obj.value = arr.splice(0,1);'时您将键'值'设置为'arr'的第一个元素的数组。除了用以下内容替换该行之外,我不确定是否有更好的方法:

obj.value = arr.reverse().pop();
arr.reverse();

我觉得对你的问题更好的解决方案是这样的:

function arrayToList(arr) {
    let list = {};

    arr.forEach(function (e, i) {
        list[i] = e;
    });

    return list;
}

function listToArray(list) {
    let array = [];

    for (let i in list) {
        array.push(list[i++]);
    }

    return array;
}

console.log(listToArray(arrayToList([10, 20, 30])));

答案 1 :(得分:0)

Array.splice()总是返回一个数组,如果它只是1个元素([10])或0个元素([])并不重要。请改为使用Array.shift()https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/shift

这里有一点清理您的代码以供进一步研究:

function ArrayToList(array) {
    let root = {};
    // final node in the list is going to be an empty object
    // since `array.length` will evaluate to `false`
    if (array.length) { // don't need a cycle here since we're recursing
        root.value = array.shift();
        root.next = ArrayToList(array);
    }
    return root;
}

function ListToArray(root) {
    let array = [];
    while (root) { // `root` will evaluate to `false` if object is empty
        if (root.value != undefined) array.push(root.value);
        root = root.next;
    }
    return array;
}