Почему array.prototype.slice () без аргументов меняет мой вывод? - PullRequest
0 голосов
/ 13 июля 2020

Я выполняю эту задачу на leetcode.

Почему так, этот ответ принято?

Мой код:

/**
 * @param {number[]} nums
 * @return {string[]}
 */
var findRelativeRanks = function(nums) {
    const map = new Map();
    let result;
    nums
        .slice()
        .sort((a, b) => b - a)
        .forEach((num, i) => map.set(num, (i + 1).toString()));
    result = nums.map(num => {
        switch(map.get(num)) {
            case "1":
                return "Gold Medal";
            case "2":
                return "Silver Medal";
            case "3":
                return "Bronze Medal";
            default:
                return map.get(num);
        }
    })
    return result;
};

Но если я просто удалю .slice(), некоторые тестовые примеры не пройдут. Почему?

1 Ответ

2 голосов
/ 13 июля 2020

Slice возвращает мелкую копию массива.

nums.slice().sort(/* ... */).forEach()

будет

  1. скопировать массив с помощью slice
  2. отсортировать массив
  3. повторял отсортированный скопированный массив.

Однако дальнейшие обращения к 'nums' не будут отсортированы, потому что копия больше не сохранялась.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...