数组方法' map'修改它被调用的数组?

时间:2014-07-02 06:06:15

标签: javascript arrays

在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'也被修改了吗?

4 个答案:

答案 0 :(得分:2)

您拥有的数据结构称为Array,并且您有对象。物体是可变的。因此,您可以更改对象的值。在您的情况下,您正在平方对象的值并将结果存储回原始对象本身并返回相同的对象。因此,map创建一个具有相同对象的新数组。

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

答案 1 :(得分: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;
});

答案 2 :(得分:0)

原始数组中的对象与新数组中引用的对象相同。如果在没有对象的情况下执行以下代码,您将看到该映射不会更改值:

var arr = [1,2,3]

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

您应该让您编写的函数将属性添加到新创建的对象中,然后返回该对象。

答案 3 :(得分:0)

let t = [1, 2, 3, 4, 5];

let x = t.map(nbre => (nbre *= nbre));

console.log(t);

console.log(x);

结果:

 [1, 2, 3, 4, 5] (t)

 [1, 4, 9, 16, 25] (x)