2014-07-02 28 views
2

在JavaScript中,我使用Array方法'map',并观察到它正在修改调用它的数组。但我读过的文档不应该是这样吗?数组方法'地图'修改它被调用的数组?

“请注意,map()返回一个新数组:它不会修改它在其上调用的数组” - JavaScript - 权威指南第6版。

var arr = [{x:1},{y:2},{z:3}] 

var arr1 = arr.map(function(obj) { 
    for (var prp in obj) { 
     obj[prp] *= obj[prp]; 
    } 
    return obj; 
}) 

// function to print the array 
printArray = function(arr) { 
    for (var i = 0; i < arr.length; i++) { 
     for (prp in arr[i]) { 
      console.log(prp, arr[i][prp]) 
     } 
    } 
} 

输出

printArray(arr1) 
x 1 
y 4 
z 9 


printArray(arr) 
x 1 
y 4 
z 9 

正如我们可以看到原始数组 'ARR' 也被修改?

+0

这是什么文档? –

+0

您传递给map的函数正在修改值并返回它。 – Ninad

回答

2

你所拥有的数据结构称为数组,你有对象。对象是可变的。所以,你可以改变对象的值。在你的情况下,你正在平衡对象的值并将结果存回原始对象本身并返回相同的对象。因此,map用相同的对象创建一个新的数组。

要清楚,数组是新的,但新数组中的对象与原始数组中的相同。

+0

因此,如果'map'方法可以/可以修改被调用的数组的内容,如果它的元素为'Objects',那么可以这样说: –

+0

@Pradeep_Evol我们在这里有两个不同的阵列。它不修改数组,它正在创建一个新数组,但使用原始数组中的对象。 – thefourtheye

0

您正在返回你从阵列得到相同的对象,这就是为什么原始值得到改变

我认为这应该为你工作。

var arr = [{x:1},{y:2},{z:3}]; 
var newArr = arr.map(function (obj) { 
    var newObj = {}; 
    for(var prop in obj){ 
     newObj[prop] = obj[prop] * obj[prop]; 
    } 
    return newObj; 
}); 
0

原始数组中的对象与新数组中引用的对象相同。如果没有物体做下面的代码,你会看到,地图不改变值:

var arr = [1,2,3] 

var arr1 = arr.map(function(val) { 
    return val *= val; 
}) 

你应该有你写的属性添加到新创建的对象的功能,然后返回对象,而不是。