Как получить доступ к первоначально переданному массиву после сортировки? - PullRequest
0 голосов
/ 25 июня 2018

При передаче массива [2,1,3,5,3,2,1] в эту функцию я выбираю сортировку от наименьшего к наибольшему. Тем не менее, когда я пытаюсь войти в систему или работать с исходным массивом, «отсортированный» и «a» записывают один и тот же отсортированный массив. Я не уверен относительно того, почему сортировка выходит за рамки только переменной «отсортировано».

function firstDuplicate(a) {
    let sorted = a.sort((a,b) => a - b);
    let duplicates = [];
    let indexes = [];

    console.log(sorted);
    console.log(a);

Есть идеи? Спасибо!

Ответы [ 4 ]

0 голосов
/ 25 июня 2018

вам нужно создать копию из исходного массива, попробуйте это

Array.prototype.clone = function(){
        let array = this;
        let newArray = [];
        // clone the objects in array
        let cloneObject = function(item){
            let newObject = {};
            for(o in item){
                if(typeof(item[o])!="object"){
                    newObject[o] = item[o];   
                }
                else{
                    newObject[o] = cloneObject(item[o]);   
                }
            }                
         return newObject;

        }
        for(let i =0; i<array.length;i++){
            let item = array[i];
            // if item is not object add value to array
            if(typeof(item)!="object"){
                newArray.push(item);
            }
            // if element is object, clone item and add to array
            else{
                newArray.push(cloneObject(item));
            }
        }
        return newArray;

    }

        function firstDuplicate(a) {
                let sorted = a.clone().sort((a, b) => a - b);
                let duplicates = [];
                let indexes = [];

                console.log(sorted);
                console.log(a);
        }
        var element = [2, 1, 3, 5, 3, 2, 1];
        firstDuplicate(element)
0 голосов
/ 25 июня 2018

sort деструктивно сортирует массив и возвращает его.Больше нет «несортированного» массива.Если вы хотите получить несортированный массив позже, клонируйте его перед сортировкой:

let unsorted = Array.from(a)
a.sort(...)

(РЕДАКТИРОВАТЬ: на самом деле не имеет значения, сортируете ли вы клон, как Jaromanda X в его комментарии, или оригинал, как я,до тех пор, пока вы начинаете с двух массивов.)

0 голосов
/ 25 июня 2018

В массивах Javascript сортируются на месте, поэтому изменения отражаются в обоих массивах. Что вы можете сделать, это клонировать ваш исходный массив, а затем отсортировать этот клонированный массив. Вы можете клонировать массив, используя Array.slice (), Array.slice () возвращает новый массив).

   let sorted = a.slice().sort();
0 голосов
/ 25 июня 2018

sort сортирует массив на месте - он не копирует массив и не создает новый, исходный массив модифицируется.Если вы хотите разделить оригинал и отсортированные, вы должны явно сделать копию перед сортировкой, что можно сделать, вызвав slice(0) для оригинала:

function firstDuplicate(a) {
  let sorted = a.slice(0).sort((a, b) => a - b);
  let duplicates = [];
  let indexes = [];

  console.log(sorted);
  console.log(a);
}
firstDuplicate([2, 1, 3, 5, 3, 2, 1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...