[英]Returning from Array.prototype.map() is not consistent
我正在嘗試從以下位置獲取此 output ['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('')
添加到subarray
的末尾來獲得我想要的結果。 我的問題不是關於如何獲得['1', '12', '123']
但是,為什么返回與控制台上輸出的子數組相同的子數組會導致[[1','2','3'], ['1','2','3'], ['1','2','3']]
而不是[[1], [1,2], [1,2,3]]
很奇怪,console.log(subarray) 中的 output 與填充在 the.map() 中的返回子數組不同我在這里遺漏了什么嗎? 提前致謝。
問題是子數組在每個 map '迭代'中都在變化,因為您沒有創建新的子數組,只是將相同的引用傳遞給返回。 它將改變所有三種情況。
首先,它返回[1]
,然后返回[1,2]
並將第一個更改為[1,2]
。 最后一個元素也是如此。 最后,您將擁有一個由相同引用(子數組)的三個副本組成的數組。
通過擴展運算符修復它
function getSubstrings(string) { let array = string.split(''); let subarray = []; return array.map(element => { subarray.push(element); return [...subarray].join(""); // join to get the desired output }); } console.log(getSubstrings("123"))
請注意,子數組在每次迭代中都會被修改,而不是創建新的子數組。 所以實際上發生的是你傳遞了完全相同的引用來返回,因此導致所有結果都發生了變化。
我建議將其重構為使用 forEach,如下所示:
const arr = getSubstrings('123'); function getSubstrings(string) { let array = string.split(''); let mainArray = []; let cur = ''; array.forEach(x => { cur += x; mainArray.push(cur); }) return mainArray; } console.log(arr)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.