我是JS的新手,正在尝试创建一个简单的“如果数组A元素大于数组B元素,则交换数组元素”功能。在swapIndexes
函数中,我不明白为什么无法定义注释中所示的变量。例如,如果它声明arrA[c]
而不是let a = arrA[c]
,它就可以工作。
为什么会这样?任何人都可以就如何最好地进行此类操作提供一些初学者提示吗?我的代码很冗长。感谢您的帮助。
var arrA = [0, 1, 2, 7, 6],
arrB = [0, 1, 2, 5, 7],
indexesToSwap = [],
aValuesToSwap = [],
bValuesToSwap = [],
needSwapping = false;
arrA.forEach(getSwappableIndexesAndValues);
indexesToSwap.forEach(swapIndexes);
function getSwappableIndexesAndValues(c, i) {
let b = arrB[i];
if (c > b) {
needSwapping = true;
indexesToSwap.push(i);
aValuesToSwap.push(b);
bValuesToSwap.push(c);
}
}
function swapIndexes(c, i) {
//let a = arrA[c]; fails why???
//let b = arrB[c]; fails why???
//a = aValuesToSwap[i]; fails why???
//b = bValuesToSwap[i]; fails why???
arrA[c] = aValuesToSwap[i];
arrB[c] = bValuesToSwap[i];
}
console.log(arrA);
console.log(arrB);
答案 0 :(得分:2)
在javascript中,当您从数组中的给定索引创建变量时,这将创建一个新的内存空间,其中包含该索引处的值的副本。新创建的变量将不会指向数组的内容,因此,修改此变量将不会修改数组的内容。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let
答案 1 :(得分:1)
var arrA = [0, 1, 2, 7, 6],
arrB = [0, 1, 2, 5, 7],
indexesToSwap = [],
aValuesToSwap = [],
bValuesToSwap = [],
needSwapping = false;
arrA.forEach(getSwappableIndexesAndValues);
indexesToSwap.forEach(swapIndexes);
function getSwappableIndexesAndValues(c, i) {
let b = arrB[i];
if (c > b) {
needSwapping = true;
indexesToSwap.push(i);
aValuesToSwap.push(b);
bValuesToSwap.push(c);
}
}
function swapIndexes(c, i) {
//let a = arrA[c]; fails why???
//let b = arrB[c]; fails why???
//a = aValuesToSwap[i]; fails why???
//b = bValuesToSwap[i]; fails why???
arrA[c] = bValuesToSwap[i];
arrB[c] =aValuesToSwap[i];
console.log( arrA[c], arrB[c]);
console.log( aValuesToSwap[i], bValuesToSwap[i]);
}
console.log(arrA);
console.log(arrB);
答案 2 :(得分:1)
indexesToSwap具有您需要交换的所有信息。交换值数组(aValuesToSwap,bValuesToSwap)使事情变得非常复杂,并且完全没有必要。
不管交换数组的值是什么,交换都是一项基本操作,通常涉及一个简单的临时操作,例如
temp = arrA[i];
arrA[i] = arrB[i];
arrB[i] = temp;
摒弃复杂性,这是getSwappableIndexesAndValues函数的替代方法
function getSwappableIndexes(c, i) {
if (c > arrB[i])
indexesToSwap.push(i);
}
以及简化的交换功能
function swapIndexes(c, i) {
let temp = arrA[c];
arrA[c] = arrB[c];
arrB[c] = temp;
}
我不得不进一步说,尽管Array.forEach 的使用会使整个解决方案复杂化。除非这是一项任务,否则最好在此处使用简单的for循环。
// swaps values between arrays where the value in
// array a is greater than the value in array b
//
function swapIfGreaterThan(a,b) {
for(let i = 0; i < a.length && i < b.length; i++) {
if(a[i] > b[i]) {
let temp = a[i];
a[i] = b[i];
b[i] = temp;
}
}
}