js 数据push问题

 let item = {
          expenseId: this.expenseId,
          expenseName: this.expenseName,
          isForbidden: this.isForbidden,
          detailList: this.detailList  //数组
        }
        this.item = item
        console.log(this.item,'单条')
        let list = []
        list.push(this.item)
        this.list = list //
        console.log(this.list)

想拼接数组,我这样push是哪里的问题,list里边的detailList总是只保留最后一条数据,多添加几个前边的数据会被替换,detailList是一个数组,
第一次添加一条数据

img

然后继续添加一条数据,

img


那肯定啊,item的值都被改变了,数组的引用还是用一个地址,你直接this.list.push(item)就行了,不用做这么多那个什么this.item=xxx,又list.pash(this.item),this.list=list

你要把你那个添加的方法 发出来看看,你点击添加的时候触发的push操作,我在这里面没看到你对 detailList 操作过啊

detailList值总是最后一条数据解决办法
this.list.push(JSON.parse(JSON.stringify(item)))
原因:对象是引用类型,传递的是引用地址,所以你两个数组引用的是同一个对象,只要其中一个数组改变,就会导致对象改变,进而另一个引用的数组也会改

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    可能是因为detailList数组被声明为全局变量或者在循环中声明的局部变量没有初始化而导致每次循环都对同一个数组进行push操作,从而覆盖之前的数据。解决该问题可以将detailList声明为函数内部的局部变量并初始化,或者在每次循环时都声明一个新的数组。

    以下是示例代码:

    // 初始化detailList数组
    let detailList = [];
    
    // 将detailList声明为函数内部的局部变量
    function yourFunction() {
      let detailList = [];
    
      // 循环中声明新数组
      for (let i = 0; i < someArray.length; i++) {
        let tempArr = [];
        // 将数据添加到tempArr中
        tempArr.push(someData);
    
        // 将tempArr添加到detailList中
        detailList.push(tempArr);
      }
    
      // 对detailList进行操作...
    }
    

    如果以上方法没有解决问题,可以提供更多的代码以供参考。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^