【问题标题】:How to prevent object change after function executes?函数执行后如何防止对象更改?
【发布时间】:2015-06-26 13:16:04
【问题描述】:

我用谷歌搜索了很多,但无法找到它......

我有一个对象

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)。它基本上只是对该数组进行排序并返回一个排序后的数组,就像在许多教程中所写的那样。

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']));

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

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

【问题讨论】:

  • 我没有看到attr 被用在了哪里?
  • 复制对象。
  • attrprop 吗?从你的使用方式来看,看起来像过滤器......
  • 是的,道具是由 attr 制成的。复制的正确方法是什么?我试着做 var arr = games;在函数的开头,但它没有工作

标签: javascript sorting object closures


【解决方案1】:

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

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

【讨论】:

  • 这是一种常见的方法吗?我试着做 var arr = games;在函数的开头,但它没有工作。
  • var arr = games 保留对games 的引用,所以它没有帮助。通常一个深拷贝会有所帮助。使用 JSON 的解决方法是归档它的常用方法。唯一的缺点是,它只适用于属性。
猜你喜欢
  • 2021-12-05
  • 1970-01-01
  • 2016-09-01
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 2014-05-04
相关资源
最近更新 更多