如何让map函数返回一个比第一个数组大的数组?

问题描述 投票:0回答:1

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
javascript arrays dictionary traversal
1个回答
2
投票

更新

回答你的意见。.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() 并不意味着你应该这样做。这样做很可能会引入意想不到的行为,并使未来的开发者更难推理出代码在做什么。

对你的函数来说,返回一个新的变量比突变输入参数要好得多。

© www.soinside.com 2019 - 2024. All rights reserved.