You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript数组push元素时所有元素重复为最后添加值的问题

问题原因

JavaScript中数组是引用类型,变量存储的是数组的内存地址,而非数组本身的值。
你的代码里只在循环外创建了一次coordinates数组,整个循环执行过程中,所有对坐标的修改都是在操作这同一个数组。每次执行positions.push(coordinates)时,存入positions的并不是当前坐标值的独立副本,只是coordinates数组的内存引用。
这就导致positions里的所有元素本质上都指向内存里的同一个数组,你每次修改coordinates的元素值,之前存入positions的所有条目因为指向同一块内存,读取时都会拿到最新修改后的值,最终打印时所有元素就会全部显示为最后一次修改的结果。
额外说明:你代码里用positions.indexOf(coordinates)做判断也会受引用类型特性影响——哪怕两个数组的元素值完全相同,只要不是指向同一个内存地址的数组,indexOf都会返回-1,无法正确判断坐标是否已经存在。

修复方案

每次往positions存入坐标时,创建当前coordinates的浅拷贝,存入副本而非原数组的引用即可。
修复后可正常运行的代码:

const input = `^>v<`.split("")
const positions = []
let coordinates = [0, 0]
// 存入初始位置的副本
positions.push([...coordinates])

for (const dir of input) {
  if (dir === "^") coordinates[1] += 1
  if (dir === "v") coordinates[1] -= 1
  if (dir === ">") coordinates[0] += 1
  if (dir === "<") coordinates[0] -= 1
  // 存入当前坐标的浅拷贝
  positions.push([...coordinates])
}

console.log(positions)

修复后执行的正常输出:

[
  [0, 0], [0, 1],
  [1, 1], [1, 0],
  [0, 0]
]

内容的提问来源于stack exchange,提问作者Camilo Fonseca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 02:03:27