javascript - 从列表到数组

标签 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循环的第二个参数是变量?另外为什么第三个参数将我们的变量等同于类型?

最佳答案

说明

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 开头的原因了。是因为listobject需要遍历。请注意下一个 node始终包含在 node.rest 中。所以为了“递增”,我们需要分配 node.restnode使用node = node.rest 。现在我们了解了这些部分:

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

剩下的部分是检查 for 循环是继续还是终止的语句。我们知道如果nodenull ,那么就没有更多的节点需要遍历了,所以我们可以检查一下。在 JavaScript 中,从 Boolean(null) === false 开始,我们可以简单地断言node是“真实的”继续,因为 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;
}

关于javascript - 从列表到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37886741/

相关文章:

c - 希望通过 C 中等效的 ASCII 值将 int 存储在 char 数组中

mysql - 将 PHP 设置数据存储为数组或 MySQL 数据库?

c - 尝试删除头时删除第 N 个节点中断

c - 显示时有鬼影输出;嵌套链表 [C]

javascript - 如何 promise Cordova 文件插件?

JavaScript 幻灯片显示函数问题

C++ 对象数组 - 类型不完整

c++ - Xcode : Thread 1: EXC_BAD_ACCESS (code=1, address=0x0) 制作邻接表时

javascript - 社会安全号码输入验证

javascript - Angular 在指令中的元素外部单击