2016-12-21 3 views
1
function bubbleSort(toSort) { 
    let sort = toSort; 
    let swapped = true; 
    while(swapped) { 
    swapped = false; 
    for(let i = 0; i < sort.length; i++) { 
     if(sort[i-1] > sort[i]) { 
     let temp = sort[i-1]; 
     sort[i-1] = sort[i]; 
     sort[i] = temp; 
     swapped = true; 
     } 
    } 
    } 
    return sort; 
} 

let asdf = [1,4,3,2]; 
let asd = bubbleSort(asdf); 

console.log(asdf, asd); 

Выход на этот код: [1, 2, 3, 4] [1, 2, 3, 4].Почему эта функция мутирует данные?

Что бы ожидать:                 [1, 4, 3, 2] [1, 2, 3, 4].

Что мне интересно, почему это мутирует переменную asdf? Функция bubbleSort принимает данный массив (asdf), создает его копию (sort), а затем обрабатывает эту переменную и возвращает ее, для которой asd задано равным. Я чувствую себя идиотом, но я понятия не имею, почему это :(

+0

сделать копию массива, 'пусть сортировки = toSort.slice(); '- см https://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference- или-pass-by-value-language –

+0

См. этот http://stackoverflow.com/questions/41255297/why-does-this-function-mutate-data/41255422#41255422 – vijay

ответ

5

Функция BubbleSort принимает данный массив (Asdf), делает копию (сортировки)

Нет, это Безразлично .. т Назначение не делает копию объекта, он создает другую ссылку на существующий объект

простой способ скопировать массив является использование Array.prototype.slice:

let sort = toSort.slice(0); 

Подробнее о копировании объектов в целом см .: How do I correctly clone a JavaScript object?

1

Вы сортируете входной список, указанный как аргумент функции, который изменен. Когда вы назначаете список новой переменной, он не создает «копию», он просто создает другую ссылку, указывающую на тот же список, те же данные, которые затем вы выбираете. Вот почему переменные asdf и add одинаковы, поскольку они представляют собой две переменные, которые указывают на одно и то же местоположение памяти, те же данные.

Если вы хотите скопировать массив, чтобы не изменять входной массив, просмотрите метод javascript slice().

0

Вам необходимо клонировать исходный массив, чтобы избежать изменения в исходном массиве. клон может быть сделан с помощью

  1. среза) метода прототипа (.
  2. петля.
  3. Array.from().
  4. concat().

Заменить let sort = toSort; с let sort = toSort.slice(0); или

let sort=[]; 
    for(var i=0;i < toSort.length;i++){ 
    sort[i]=toSort[i]; 
    } 

или

let sort = Array.from(toSort); 

или

let sort = toSort.concat(); 

function bubbleSort(toSort) { 
 
    let sort = toSort.slice(0); 
 
    let swapped = true; 
 
    while (swapped) { 
 
    swapped = false; 
 
    for (let i = 0; i < sort.length; i++) { 
 
     if (sort[i - 1] > sort[i]) { 
 
     let temp = sort[i - 1]; 
 
     sort[i - 1] = sort[i]; 
 
     sort[i] = temp; 
 
     swapped = true; 
 
     } 
 
    } 
 
    } 
 
    return sort; 
 
} 
 

 
let asdf = [1, 4, 3, 2]; 
 

 
let asd = bubbleSort(asdf); 
 

 
console.log(asdf, asd);

Смежные вопросы