我正在通过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])));
有谁可以解释这里发生的事情?
答案 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;
}