从同一数组创建两个不同的变量

时间:2019-05-30 13:23:55

标签: javascript

我有一个数组,我想从同一数组中创建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']

3 个答案:

答案 0 :(得分:1)

这是因为保留了对原始letters数组的引用。

lettersUnsortedletterSorted都引用letters变量。这是因为letters是一个数组(从技术上讲是一个对象),在JavaScript中,为其分配另一个变量将导致按引用分配(而不是按值分配)。因此,由于对letters的引用,对lettersUnsorted进行的任何操作或更改都会导致letterSortedlettersletter具有相同的结果。

您应该创建原始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();