从 Array.prototype.map doucmentation.它提到,应该可以在map回调中对调用map的数组进行突变,它需要三个参数:#1值,#2索引,#3原始数组,此外还有以下内容。
thisArgOptional 执行回调时使用的值。 ... 详细参数
调用回调时有三个参数:元素的值、元素的索引和被映射的数组对象。
如果提供了thisArg参数,它将被用作回调的this值,否则,将使用未定义的值作为它的this值。否则,将使用未定义的值作为它的this值。 最终可被回调观察到的this值是根据函数所看到的this值的通常规则来确定的。
map不会对被调用的数组进行突变(尽管如果调用callback,可能会这样做)。
map所处理的元素范围是在第一次调用callback之前设置的。在调用map开始后追加到数组中的元素不会被回调访问。
所以说,虽然 "添加到原数组 "的值不会被map遍历,但这意味着确实可以从map内部,追加到原数组。然而,我不知道如何做到这一点,因为简单地使用第三个数组参数并追加到它,似乎没有任何作用(如果我把它存储到数组中,我不能只使用原来的数组变量名,因为map返回一个全新的数组)。
var myArr = [
1, 2, 3, 4, 5
].map(function(x, i, arr) {
this.push(i); //references old array so does nothing
arr.push(i); //seemingly it should adjust
return x;
}, myArr /*
attempting to use "this"
arg to see if it will work,
although seemingly its not recognized
*/
);
console.log(myArr); //only returns original value
回答你的意见。.map()
并不是一个正确的将值追加到数组中的工具。你应该在需要修改输入数组的每个元素时使用它,例如将每个值翻倍。
var input = [1,2,3,4,5];
var myArr = input.map(function (x) {
return x * 2;
});
myArr.push(6,7); // Append your values in a separate statement.
console.log(myArr); // [2,4,6,8,10,6,7]
然后根据你想达到的目的,在map之前或之后单独添加新的值。
你的代码没有按照你期望的方式运行。console.log(myArr)
看起来好像是在打印原始数组,但实际上不是。举个例子,如果你去掉所有其他的代码,你将会剩下这个。
var myArr = [1,2,3,4,5].map(function (x) {
return x;
});
console.log(myArr); // [1,2,3,4,5]
你可以看到我们只是返回 x
不做任何改变。x
将决心 1
那么 2
、等依次进行。的输出。.map()
因此将 [1,2,3,4,5]
其中包含了与你的输入数组相同的值,但并不是完全相同的数组,它是一个副本。
你可以通过将你的输入数组移到一个新的变量中,然后比较一下 myArr === input
在最后。
var input = [1,2,3,4,5];
var myArr = input.map(function (x) {
return x;
});
console.log(input); // [1,2,3,4,5]
console.log(myArr); // [1,2,3,4,5]
console.log(myArr === input); // false
再进一步,如果我们把第三个参数... .map()
并将每个元素替换为其值的两倍,,,我们会看到,原来的 input
阵列 是否 的返回值,以及 .map()
, myArr
保持不变。
var input = [1,2,3,4,5];
var myArr = input.map(function (x, i, arr) {
arr[i] = x * 2;
return x;
});
console.log(input); // [2,4,6,8,10]
console.log(myArr); // [1,2,3,4,5]
console.log(myArr === input); // false
就因为你 可以 的第3个参数修改原数组。.map()
并不意味着你应该这样做。这样做很可能会引入意想不到的行为,并使未来的开发者更难推理出代码在做什么。
对你的函数来说,返回一个新的变量比突变输入参数要好得多。