sort函数更改副本和原始

时间:2017-08-04 15:13:13

标签: javascript arrays

我有这个代码,它改变了原始数组arr,即使我将它复制到一个名为copy的变量。 数据(arr)由代码报告提供

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?

2 个答案:

答案 0 :(得分:2)

// make copy of arr not to affect it
let copy = arr;

实际上并非如此;你刚刚创建了第二个变量引用了同一个数组实例。

您可以致电arr.slice()来创建实际副本。

答案 1 :(得分:0)

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

1) Vanilla JS:

int count = 0;

if (count == 0) {
    NextButton.setEnabled(false);
}
    @Override
    public void onClick(View v) {
        switch(v.getId()) {
            case R.id.otherButtons:
                count++;
                NextButton.setEnabled(true);
                Toast.makeText(this, "Button Disabled", Toast.LENGTH_LONG).show();
                break;


        case R.id.nextButton:
            //Move the user to the next question
            break;        
    }
}

2) Lodash:

E.g

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