Javascript Map函数不保留原始对象

时间:2016-10-08 22:11:59

标签: javascript

我有一个场景,我有

var data = [
    {
        "x": 1,
        "y": 0.27,
        "classifier": 1
    },
    {
        "x": 2,
        "y": 0.88,
        "classifier": 1
    }
]

我想要另一个y = 1-y的对象data2,我得到:

var data2 = data.map(function(el) {el.y = 1-el.y; return el});

data2[0]
Object {x: 1, y: 0.73, classifier: 1}

data2[1]
Object {x: 2, y: 0.12, classifier: 1}

这是我想要数据的正确形式。但问题是我想保留原始数据。现在,即使数据也有变异数据。

data[0]
Object {x: 1, y: 0.73, classifier: 1}

data[1]
Object {x: 2, y: 0.12, classifier: 1}

地图是否适用于此处?我正确使用它吗?

2 个答案:

答案 0 :(得分:1)

您正在修改原始元素对象,而不是原始数据的完整深层副本。

在函数中创建el的副本,然后计算新的.y。例如:

var data2 = data.map(function(el) {
  return {
    x : el.x,
    y : 1-el.y,
    classifier : el.classifier
  };
});

答案 1 :(得分:1)

创建一个新数组时,让它的值指向原始对象,通过赋值给对象属性进行变异。

相反,您也可以使用Object.assign

创建对象的(浅)副本
var data2 = data.map(function(el) { 
    return Object.assign({}, el, { y: 1-el.y });
});

或使用箭头功能:

var data2 = data.map( el => Object.assign({}, el, { y: 1-el.y }) );

var data = [
    {
        "x": 1,
        "y": 0.27,
        "classifier": 1
    },
    {
        "x": 2,
        "y": 0.88,
        "classifier": 1
    }
]
var data2 = data.map( el => Object.assign({}, el, { y: 1-el.y }) );

console.log (data);