使用解构赋值和 indexOf() 交换数组值
Swapping array values with destructuring assignment and indexOf()
我正在尝试交换包含数字 0-14 的随机数组中的两个最低值。对于那些好奇的人,我正在为 pkpnd here.
描述的 15 拼图实现洗牌算法
我想按照 here 所述尝试解构赋值,但遇到了意外行为。我意识到我可以通过创建一个临时变量来让我的代码工作(并使其更具可读性),但我想在继续之前了解发生了什么。
我正在获取数组 [1,2]
的一个子集,然后尝试用 [2,1]
替换它。出于某种原因,它仅在原始数组中的顺序与我的子集顺序 相反 时才交换值。
我最初试过这个:
var arr1 = [1, 2, 3, 4];
var arr2 = [2, 1, 3, 4];
[arr1[arr1.indexOf(1)], arr1[arr1.indexOf(2)]] = [arr1[arr1.indexOf(2)], arr1[arr1.indexOf(1)]];
[arr2[arr2.indexOf(1)], arr2[arr2.indexOf(2)]] = [arr2[arr2.indexOf(2)], arr2[arr2.indexOf(1)]];
console.log("arr1: " + arr1, "\narr2: " + arr2);
然后尝试这个:
var arr1 = [1, 2, 3, 4];
var arr2 = [2, 1, 3, 4];
[arr1[arr1.indexOf(1)], arr1[arr1.indexOf(2)]] = [2, 1];
[arr2[arr2.indexOf(1)], arr2[arr2.indexOf(2)]] = [2, 1];
console.log("arr1: " + arr1, "\narr2: " + arr2);
但两者产生相同的输出:
arr1: 1,2,3,4
arr2: 1,2,3,4
我希望两个数组的 1 和 2 的位置会互换,但它们只在 arr2 中互换。我怀疑这与创建初始数组子集 [1,2]
的方式有关,但我不确定。
谁能解释为什么值不总是交换?
结果很简单,因为解构赋值的每一项都是一步一步来的。当值发生变化时,值的索引也会发生变化。
案例 1 [1, 2, 3, 4]
获取第一个值的目标索引2
[arr1[arr1.indexOf(1)], arr1[arr1.indexOf(2)]] = [2, 1];
// ^^^^^^^^^^^^^^^ 0
将2
分配给arr1[0]
[2, 2, 3, 4]
获取第二个值的目标索引1
:
[arr1[arr1.indexOf(1)], arr1[arr1.indexOf(2)]] = [2, 1];
// ^^^^^^^^^^^^^^^ 0
将1
分配给arr1[0]
[1, 2, 3, 4]
案例 2 [2, 1, 3, 4]
获取第一个值的目标索引2
[arr2[arr2.indexOf(1)], arr2[arr2.indexOf(2)]] = [2, 1];
// ^^^^^^^^^^^^^^^ 1
将2
分配给arr1[1]
[2, 2, 3, 4]
获取第二个值的目标索引1
:
[arr2[arr2.indexOf(1)], arr2[arr2.indexOf(2)]] = [2, 1];
// ^^^^^^^^^^^^^^^ 0
将1
分配给arr1[0]
[1, 2, 3, 4]
我正在尝试交换包含数字 0-14 的随机数组中的两个最低值。对于那些好奇的人,我正在为 pkpnd here.
描述的 15 拼图实现洗牌算法我想按照 here 所述尝试解构赋值,但遇到了意外行为。我意识到我可以通过创建一个临时变量来让我的代码工作(并使其更具可读性),但我想在继续之前了解发生了什么。
我正在获取数组 [1,2]
的一个子集,然后尝试用 [2,1]
替换它。出于某种原因,它仅在原始数组中的顺序与我的子集顺序 相反 时才交换值。
我最初试过这个:
var arr1 = [1, 2, 3, 4];
var arr2 = [2, 1, 3, 4];
[arr1[arr1.indexOf(1)], arr1[arr1.indexOf(2)]] = [arr1[arr1.indexOf(2)], arr1[arr1.indexOf(1)]];
[arr2[arr2.indexOf(1)], arr2[arr2.indexOf(2)]] = [arr2[arr2.indexOf(2)], arr2[arr2.indexOf(1)]];
console.log("arr1: " + arr1, "\narr2: " + arr2);
然后尝试这个:
var arr1 = [1, 2, 3, 4];
var arr2 = [2, 1, 3, 4];
[arr1[arr1.indexOf(1)], arr1[arr1.indexOf(2)]] = [2, 1];
[arr2[arr2.indexOf(1)], arr2[arr2.indexOf(2)]] = [2, 1];
console.log("arr1: " + arr1, "\narr2: " + arr2);
但两者产生相同的输出:
arr1: 1,2,3,4
arr2: 1,2,3,4
我希望两个数组的 1 和 2 的位置会互换,但它们只在 arr2 中互换。我怀疑这与创建初始数组子集 [1,2]
的方式有关,但我不确定。
谁能解释为什么值不总是交换?
结果很简单,因为解构赋值的每一项都是一步一步来的。当值发生变化时,值的索引也会发生变化。
案例 1 [1, 2, 3, 4]
获取第一个值的目标索引
2
[arr1[arr1.indexOf(1)], arr1[arr1.indexOf(2)]] = [2, 1]; // ^^^^^^^^^^^^^^^ 0
将
2
分配给arr1[0]
[2, 2, 3, 4]
获取第二个值的目标索引
1
:[arr1[arr1.indexOf(1)], arr1[arr1.indexOf(2)]] = [2, 1]; // ^^^^^^^^^^^^^^^ 0
将
1
分配给arr1[0]
[1, 2, 3, 4]
案例 2 [2, 1, 3, 4]
获取第一个值的目标索引
2
[arr2[arr2.indexOf(1)], arr2[arr2.indexOf(2)]] = [2, 1]; // ^^^^^^^^^^^^^^^ 1
将
2
分配给arr1[1]
[2, 2, 3, 4]
获取第二个值的目标索引
1
:[arr2[arr2.indexOf(1)], arr2[arr2.indexOf(2)]] = [2, 1]; // ^^^^^^^^^^^^^^^ 0
将
1
分配给arr1[0]
[1, 2, 3, 4]