Dies liegt daran, dass Sie das letzte Objekt zurückgeben, das auf list
festgelegt wurde. Um die erste in der verknüpften Liste zurückzugeben, behalten Sie einen Verweis darauf vor der Schleife bei und geben Sie diese zurück.
Obwohl Ihre verknüpfte Liste umgekehrt als das Array ist. Ich bin mir nicht sicher, ob du das beabsichtigt hast.
Wenn Sie das Array spiegeln, und verknüpfen vorwärts, tun dies, um Fahndungsliste:
function arrayToList(array) {
var first = {value: array[0], rest: null};
var prev = first;
for (var i = 1; i < array.length ; i++)
prev.rest = prev = {value: array[i], rest: null};
return first;
}
console.log(arrayToList([10,20]));
Nehmen wir an, wir haben keine eine Schleife, und sind nur die ganze Sache inlining. So würde es aussehen. Ich werde es auch tun, als ob das Array [10, 20, 30]
wäre.
function arrayToList(array) {
// Here `first` and `prev` reference the same object
var first = {value: array[0], rest: null};
var prev = first;
// first = {value: 10, rest: null};
// prev = {value: 10, rest: null};
// Then we assign a new object to `prev.rest` as well as `prev`.
// Because the `prev` and `first` variables reference the same object,
// the mutation of `prev.rest` is also seen from `first.rest`.
// First iteration
prev.rest = prev = {value: array[1], rest: null};
// now...
// first = {value: 10, rest: (reference to object with value: 20)};
// prev = {value: 20, rest: null};
// So it first changed `prev.rest` (and therefore `first.rest`) to point to
// the new object, but then it also updated `prev` to the same, new object.
// Take note that though we assigned the new object to `prev.rest`, after
// the assignment, `prev.rest` is actually `null`, because the `prev.rest`
// that we assigned to was the `.rest` of the *previous* `prev`, which was
// immediately updated to see the *new* object.
// Second iteration
prev.rest = prev = {value: array[2], rest: null};
// now...
// first = {value: 10, rest: (reference to object with value: 20)};
// prev = {value: 30, rest: null};
// So now when we changed `prev.rest`, it had no impact on `first` because
// `prev` and `first` are referencing different objects. So `prev` sees the
// new object, but `first` does not.
return first;
}
Sie den 'list' bei jeder Iteration zu modifizieren, so macht es Sinn, dass' value' zum letzten Punkt in dem 'array' gleich sein wird. – Kairat
Ihre for-Schleife läuft über jedes Element im Array (Arrays beginnen bei Index 0). Wenn die Schleife zum ersten Mal ausgeführt wird, ist "Wert" 10 und "Rest" ist Null. Das *** 2. *** Mal, dass die Schleife läuft, "Wert" wird auf 20 gesetzt, dann wird "Ruhe" auf das vorherige Objekt gesetzt. –
Als eine Nebenfrage, wie kann ich eine Funktion erstellen, die diese ArrayToList-Funktion wieder zu einem Array machen würde? Die Lösung ist hier eloquentjavascript.net/code/#4.3, aber ich bin nicht wirklich sicher, wie man den for-Schleife Sinn macht, wusste ich nicht, eine Variable kann der zweite Parameter einer for-Schleife sein. Irgendeine Einsicht bitte? –