Javascript 从Array.prototype.map()返回的值不一致

Javascript 从Array.prototype.map()返回的值不一致,javascript,Javascript,我正在尝试从以下位置获取此输出['1','12','123']: getSubstrings('123'); function getSubstrings(string) { let array = string.split(''); let subarray = []; return array.map(element => { subarray.push(element); console.log(sub

我正在尝试从以下位置获取此输出
['1','12','123']

   getSubstrings('123');

   function getSubstrings(string) {
      let array = string.split('');
      let subarray = [];
      return array.map(element => {
        subarray.push(element);
        console.log(subarray)       //this gets me ['1'], then ['1','2'] ...
        return subarray;            //but this is not returning the same as in console.log(subarray)   
      });
      
    }

我知道我可以通过将
.join(“”)
添加到
子数组的末尾来获得想要的结果。我的问题不是关于如何获取
['1'、'12'、'123']
,但是,为什么返回与控制台上输出的子数组相同的子数组会导致
[[1'、'2'、'3']、['1'、'2'、'3']、['1'、'2'、'3']
而不是
[[1]、[1,2]、[1,2,3]
控制台的输出。log(子数组)是否与.map()中填充的返回子数组不一样?我是否遗漏了什么?提前感谢。

问题是子数组在每个贴图“迭代”中都会发生变化,因为您没有创建新的子数组,只是传递相同的引用以返回。这将改变所有三种情况

首先,它返回
[1]
,然后返回
[1,2]
,并将第一个更改为
[1,2]
。最后一个元素也是如此。最后,您将有一个由同一引用(子数组)的三个副本组成的数组

用螺丝钉把它修好

函数getsubstring(字符串){
让数组=string.split(“”);
设子阵=[];
返回array.map(元素=>{
子阵推(元);
返回[…子数组].join(“”;//join以获得所需的输出
});
}

log(getSubstrings(“123”))
注意,子数组在每次迭代中都会被修改,并且不会创建新的子数组。因此,实际发生的情况是,您将完全相同的引用传递给return,从而导致更改所有结果

我建议重构它以使用forEach,类似这样的东西:

const arr=getsubstring('123');
函数GetSubstring(字符串){
让数组=string.split(“”);
让mainArray=[];
让cur='';
array.forEach(x=>{
cur+=x;
主阵列推送(cur);
})
返回主数组;
}

console.log(arr)
因为它是同一个数组,结果中的每个地方怎么可能不同?返回数组并不会复制它。JS中的数组是对象,JS中的对象是通过引用传递的。例如,
var a=[1,2,3];b=a;a、 推(4);控制台日志(b)
您可能会认为它是
1,2,3
,但它是
1,2,3,4
。。因为b只是对a.map的一个引用((u,i,a)=>a.slice(0,i+1)。join(“”))
啊,我明白了。谢谢你的解释!不用谢!如果它帮助你可以考虑给我一个赞成票(PLZ,我需要信誉:D),我只是意识到当数组被绕过时,它就变了。谢谢,没问题。如果你能投赞成票并接受它,我将不胜感激