JavaScript,从原始Object的副本中删除属性,实际上影响原始对象

时间:2018-01-23 07:35:43

标签: javascript arrays json object

说我有一个对象数组

var result = [{
    "sss": "sssssss",
    "yyy": "ssdsdsds",
    "www": "1212121",
    "Group": "Mango"
}, {
    "sss": "sssssss",
    "yyy": "ssdsdsds",
    "www": "1212121",
    "Group": "Mango"
}]

我想得到最终结果:

var result ={
   "Mango" : [
        {
            "sss": "sssssss",
            "yyy": "ssdsdsds",
            "www": "1212121"
        }, {
            "sss": "sssssss",
            "yyy": "ssdsdsds",
            "www": "1212121"
        }
    ]
}

所以我做了这个

var obj = [];

for(var i = 0; i < result.length; i++ ){
    if(obj[result[i].Group] && obj[result[i].Group].constructor === Array ){

    }else{
        obj[result[i].Group] = [];
        // ################### PROBLEM ==========
        var x = result[i];
        delete x.Group;
        console.log(result[i]);
        // ################### ==================
        obj[result[i].Group].push(result[i]); // error: result[i].Group is undefined 
    }
}

代码"delete x.Group"应从var "Group"中删除属性"x"             但实际上console.log(result[i]);显示了             属性"Group"已从中删除             result[i](原创)。怎么样?

看起来变量x是对原始result[i]的引用,这是不确定的。 如何从对象副本中删除属性会影响原始属性。如何克服这个问题?

1 个答案:

答案 0 :(得分:1)

您只需使用hash结构。也。使用delete运算符删除一个对象&#39;属性。

&#13;
&#13;
var result = [{
    "sss": "sssssss",
    "yyy": "ssdsdsds",
    "www": "1212121",
    "Group": "Mango"
}, {
    "sss": "sssssss",
    "yyy": "ssdsdsds",
    "www": "1212121",
    "Group": "Mango"
}]

var groupByField = function(xs, key) {
  return xs.reduce(function(rv, x) {
    (rv[x[key]] = rv[x[key]] || []).push(x);
    delete x[key];
    return rv;
  }, {});
};
console.log(groupByField(result, 'Group'));
&#13;
&#13;
&#13;

然而,

  

如何从对象副本中删除属性如何影响   原来的?

您必须为该对象应用深层克隆