快速JavScript问题。在以下代码中,我将反转传递给函数arr
的数组reverseArray
。
在第一段代码中,即使我在循环arr
中操作且变量newArr
保留了{{1}的初始值,本地变量arr
仍在不断变化。 }。因此,当arr.length达到值3
时,循环失败。
function reverseArray (arr) {
var newArr = [];
var inArr = arr;
console.log(inArr);
for (i = 0; i < arr.length; i++) {
newArr[i] = inArr.pop(i);
}
return newArr;
}
reverseArray(["A", "B", "C", "D", "E", "F"]);
// OUTPUT: ["F", "D", "E"]
另一方面,如果我将arr.length
存储在局部变量numArr
上,则它可以完美工作并反转数组。
function reverseArray (arr) {
var numArr = arr.length;
var newArr = [];
for (i = 0; i < numArr; i++) {
let inArr = arr;
newArr[i] = inArr.pop(i);
}
return newArr;
}
reverseArray(["A", "B", "C", "D", "E", "F"]);
// OUTPUT: ["F", "E", "D", "C", "B", "A"]
我想念什么?
答案 0 :(得分:3)
您可以获取数组的副本,并使用副本的长度检查下一个pop / push命令。
# read file
df = pd.read_csv('citynames.csv', encoding='ISO-8859-1')
# sort by 'city', ascending
df = df.sort_values('city')
# export to csv
df.to_csv('citynames_out.csv', index=False)
要满足条件,您也可以使用function reverseArray(array) {
var newArr = [],
inArr = array.slice(); // take copy of primitive values
while (inArr.length) { // check decrementing length
newArr.push(inArr.pop());
}
return newArr;
}
console.log(reverseArray(["A", "B", "C", "D", "E", "F"]));
语句。
for
答案 1 :(得分:2)
pop
(MDN,spec)是一个mutator方法:它更改了调用它的数组的状态。很自然,inArr.pop(1)
修改了arr
(在您的第一个示例中),因为inArr
和arr
都引用相同的数组。
也许值得一提的是,pop
不接受任何参数,因此1
不执行任何操作。
在第一个示例中,最好的选择是为另一个变量(例如j
)分配初始值arr.length - 1
,然后使用arr[j]
来获取值,然后减小{{ 1}}随着增加j
。 (此外,没有指向i
的位置,您需要声明inArr
以避免我所说的The Horror of Implicit Globals:
i
您也可以只使用function reverseArray (arr) {
var newArr = [];
for (var i = 0, j = arr.length - 1; i < arr.length; i++, j--) {
newArr[i] = arr[j];
}
return newArr;
}
console.log(reverseArray(["A", "B", "C", "D", "E", "F"]));
而不是第二个变量:
arr[arr.length - i - 1]
答案 2 :(得分:0)
第一个函数的问题是,当您pop
来自数组arr
的元素时,它实际上减小了数组arr
的长度。这就是为什么您看到的结果少于原始元素数量的原因。
所以您的代码就是这样
1st pass: i=0 and arr.length = 6; // 0<6 true
2nd pass: i=1 and arr.length = 5; // 1<5 true
3rd pass: i=2 and arr.length = 4; // 2<4 true
4th pass: i=3 and arr.length = 3; // 3<3 false and it does not execute
所以您只会看到三个结果。
答案 3 :(得分:0)
let input = ["A", "B", "C", "D", "E", "F"];
let output = [];
for(let i = 1; i <= input.length; i++) {
// determine correct array index in respect to the current iteration
let index = input.length - i;
// push to new array
output.push(reverse[index]);
}
// verify result
console.log(output);
答案 4 :(得分:-1)
您可以尝试使用以下代码:
function reverseString(str) {
var newString = "";
for (var i = str.length - 1; i >= 0; i--) {
newString += str[i];
}
return newString;
}