【问题标题】:sort function changes the copy and the original排序功能改变副本和原件
【发布时间】:2017-08-04 15:13:12
【问题描述】:

我有这段代码,即使我将原始数组 arr 复制到我命名为 copy 的变量中,它也会更改它。 data(arr) 由 codewars 提供

cutIt(["codewars","javascript","java"])
function cutIt(arr){
  //coding here...
  //step 1 go through array and find the shortest
  // sort string by length
  // make copy of arr not to affect it
  let copy = arr;
  console.log(copy);
 //[ 'codewars', 'javascript', 'java' ]
  let sorted = copy.sort(function (a,b) {
   return a.length - b.length;

  })

  console.log(arr);
  //[ 'java', 'codewars', 'javascript' ]
}

我没有在代码中明确更改数组 arr 但输出显示它已更改?我认为通过复制它并对副本进行排序不会影响 arr?

【问题讨论】:

  • sort() 方法对数组的元素进行就地排序并返回该数组。您没有制作数组的副本,而只是制作了引用的副本。 Documentation
  • 两个变量都引用同一个数组,因此为什么要更改原始数组,尝试创建一个包含与原始元素相同的新数组。
  • 谢谢,我想我已经有了更好的理解,有点像指向同一个变量的第二个指针......

标签: javascript arrays


【解决方案1】:
// make copy of arr not to affect it
let copy = arr;

这不是真的;你刚刚让第二个变量引用了同一个数组实例。

您可以通过调用arr.slice() 创建一个实际的副本。

【讨论】:

  • 谢谢,我不知道我指的是同一个内存位置。我对于更简单的类型也是如此,例如: let i = 10;让 x = i i =i + 1 现在 i = 10 但 x = 11 ..感谢您帮助您解决切片问题
【解决方案2】:

数组不是原始数据类型。充其量它们是对象的变体。对象通过引用传递,而不是值得注意的值。就是说,如果是这样的话,有几种方法可以对数组进行深度克隆。

1) 原版JS:

E.g

const newArraryCopy = <Your array>.slice();

2) 洛达什:

E.g

var array = [{},{},{}];

var copy = _.map(array, _.clone);

【讨论】:

  • 第二种方法我暂时想不到..var array = [{},{},{}]; var copy = _.map(array, _.clone);我不明白 _.map 等,但谢谢
猜你喜欢
  • 2020-11-07
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2019-05-13
  • 1970-01-01
  • 2022-08-23
  • 1970-01-01
相关资源
最近更新 更多