函数执行后如何防止对象更改?

How to prevent object change after function executes?

我用谷歌搜索了很多,但还是找不到...

我有对象

var games = [
  {name: 'Pako', rating: 4.21},
  {name: 'Hill Climb Racing', rating: 3.88},
  {name: 'Angry Birds Space', rating: 3.88},
  {name: 'Badland', rating: 4.33}
];

以及将此对象作为参数的函数 (obj_array)。它基本上只是对该数组和 returns 排序数组进行排序,就像许多教程中所写的那样。

function sortByAttribute(obj_array, attr) {
...

return obj_array.sort(function(obj1, obj2) {
    if (obj1[prop[0]] == obj2[prop[0]]) {
        return (obj1[prop[1]] < obj2[prop[1]] ? 1: -1)*sortOrder;
    }
    return ((obj1[prop[0]] > obj2[prop[0]]) ? 1 : -1) * sortOrder;
});

}

所以,我有以下几行:

console.log(sortByAttribute(games, 'name'));

console.log(games);

console.log(sortByAttribute(games, ['-rating', 'name']));

它们都产生相同的结果并显示上次排序的结果。我明白,答案很可能在作用域和闭包中,但我不知道如何更改代码以使其以不同方式显示所有三个输出。

PS。所有这些代码现在都位于同一个文件中。

只需将其字符串化并解析并使用副本:

var gamesCopy = JSON.parse(JSON.stringify(games));