我有一个数组,我想从同一数组中创建2个不同的变量,但是此变量必须具有不同的结果。例如,一个字符串数组:第一个变量必须包含此数组,另一个变量必须包含此值但已排序。但这不起作用:
var letters = ['b', 'c', 'a']; // datas
const lettersUnsorted = letters; // i want the array like the var "letters"
const letterSorted = letters.sort(); // i want the array like the var "letters" but sorted
console.log(letterSorted); // OK => returns: ["a", "b", "c"]
console.log(lettersUnsorted); // KO => returns: ["a", "b", "c"] instead of ['b', 'c', 'a']
答案 0 :(得分:1)
这是因为保留了对原始letters
数组的引用。
lettersUnsorted
和letterSorted
都引用letters
变量。这是因为letters
是一个数组(从技术上讲是一个对象),在JavaScript中,为其分配另一个变量将导致按引用分配(而不是按值分配)。因此,由于对letters
的引用,对lettersUnsorted
进行的任何操作或更改都会导致letterSorted
和letters
与letter
具有相同的结果。
您应该创建原始letters
数组的浅表克隆。这将使您能够安全地进行任何突变,而不会影响其他阵列。我们可以使用ES6的spread syntax来实现。
const letters = ['b', 'c', 'a'];
const lettersClone = [...letters].sort();
console.log(letters);
console.log(lettersClone);
答案 1 :(得分:1)
您应该首先复制数组,因为sort()
方法会修改原始数组。您可以使用slice()
var letters = ['b', 'c', 'a'];
const lettersUnsorted = letters;
const letterSorted = letters.slice().sort(); //this line is changed
console.log(letterSorted);
console.log(lettersUnsorted);
答案 2 :(得分:0)
您也可以使用 concat 。
var letters = ['b', 'c', 'a'];
const lettersUnsorted = letters;
const letterssorted = ([].concat(letters)).sort();