从列表到数组

时间:2016-06-17 16:58:51

标签: javascript arrays linked-list

所以我正在处理一个问题,我成功解决了第一部分,这让我可以在这里添加一些类型的对象

function arrayToList(array) {
  var list = null;
  for (var i = array.length - 1; i >= 0; i--)
    list = {value: array[i], rest: list};
  return list;
}

现在这个工作正常,但是现在我试图同时制作另一个功能,这恰恰相反。解决方案就在这里

function listToArray(list) {
  var array = [];
  for (var node = list; node; node = node.rest)
    array.push(node.value);
  return array;
}

有人可以解释这个for循环是如何工作的吗?我不理解这个for循环的结构,我在w3学校看了一个类似的例子。为什么for循环的第二个参数是变量?另外,为什么第三个参数将我们的变量等同于一个类型?

2 个答案:

答案 0 :(得分:2)

说明

For loops contain 3 statements in their body

for (initialization; condition; final-expression)

我想您了解initializationfinal-expression的工作原理,但condition是确定for循环是继续迭代还是终止的测试。

由于在这种情况下node可以是对象或null,因此这些是“真实的”和“虚假的”值。 Boolean(null) === false,所以如果当前迭代已经落在null上,它就知道链表已经结束并且它可以停止循环。

操作实例

好吧,第二个for循环以node = list开头的原因是因为list是需要遍历的object。请注意,下一个node始终包含在node.rest中。因此,为了“增加”,我们需要使用node.restnode分配给node = node.rest。现在我们了解这些部分:

for (var node = list; ... ; node = node.rest)

剩下的部分是检查for循环是否应该继续或终止的语句。我们知道如果nodenull,那么就没有剩余的节点可以遍历了,所以我们可以检查一下。在JavaScript中,从Boolean(null) === false开始,我们可以简单地断言node是“truthy”来继续,因为Boolean({}) === true。所以语句node只是检查是否继续:

for (var node = list; node; node = node.rest)

演示

学习语言结构时要做的最有用的事情之一就是运行代码并查看输出自己的样子。在此示例中,array

["hello", "world", "how", "are", "you", "today"]

list

{"value": "hello", "rest": {"value": "world", "rest": {"value": "how", "rest": {"value": "are", "rest": {"value": "you", "rest": {"value": "today", "rest": null}}}}}}

/* ignore this */
console.log = function (data) {
  if (typeof data === 'object') {
    data = JSON.stringify(data, null, 2);
  }
  
  document.write('<pre>' + data + '</pre>');
}

/* pay attention to everything below here */
function arrayToList(array) {
  console.log('arrayToList\n\n');

  var list = null;
  for (var i = array.length - 1; i >= 0; i--) {
    list = {value: array[i], rest: list};
    console.log('index: ' + i);
    console.log('value: ' + JSON.stringify(array[i]));
    console.log(list);
    console.log('-----');
  }
  
  return list;
}

function listToArray(list) {
  console.log('listToArray\n\n');

  var array = [];
  for (var node = list; node; node = node.rest) {
    array.push(node.value);
    console.log('index: ' + (array.length - 1));
    console.log('value: ' + JSON.stringify(array.slice(-1)[0]));
    console.log(node);
    console.log('-----');
  }

  return array;
}

var array = ['hello', 'world', 'how', 'are', 'you', 'today'];

var list = arrayToList(array);

listToArray(list);
pre {
  margin: 0;
  padding: 0;
}

答案 1 :(得分:0)

在for的第一个语句中,您将节点变量分配给list。这是在第一次迭代运行时它将保持的初始值。然后第二个语句是一个条件,如果它是真/非空,它将继续执行for循环。您将节点变量重新分配给node.rest的第三个语句,这将使下一个循环的第二个语句发生更改。当节点变量为空值时,循环将退出。