2
votes

Map.filter () ne renvoie pas la sortie attendue

J'essaye le problème de suppression d'éléments leetcode. Le but est de supprimer tous les éléments d'un tableau égal à une certaine valeur. Par exemple, si le array = [3, 2, 2, 3] et le val = 3 le tableau de sortie doit être [2, 2].

Ma fonction de filtre semble produire la sortie correcte basée sur le journal de la console, mais dans l'instruction return, c'est quelque chose de totalement différent.

Voici une copie de mon code:

/**
 * @param {number[]} nums
 * @param {number} val
 * @return {number}
 */
var removeElement = function(nums, val) {
    let filteredNums = nums.filter(element => { 
        return element !== val
    });
    console.log(filteredNums)
    return filteredNums;
};

Voici ce que j'obtiens pour la sortie:

entrez la description de l'image ici

Y a-t-il quelque chose que je fais incorrect qui me manque?


7 commentaires

Vous devez utiliser const au lieu de var pour déclarer cette fonction.


avez-vous un lien vers la question du leetcode?


Il n'y a rien de mal avec votre code, le problème semble être une nuance d'écriture correcte du scénario de test.


Je viens d'exécuter votre code et la valeur de retour est correcte.


S'il s'agit de leetcode.com/problems/remove-element, vous devez renvoyer la longueur du tableau. Notez dans votre code le @return {number} . Il ne s'attend pas à un tableau de retour


il semble que votre question concerne la suppression des éléments du tableau et la conservation de la référence d'objet au tableau nums donné. (je répondrais, du q est rouvert.)


@GabrielePetrioli Je sais que j'étais censé renvoyer la longueur, mais quand cela ne fonctionnait pas, j'ai réalisé que le tableau de sortie ne me donnait pas ce à quoi je m'attendais


3 Réponses :


1
votes

Eh bien, cela fonctionne comme prévu:

const removeElement = function(nums, val) {
    let filteredNums = nums.filter(element => { 
        return element !== val
    });
    console.log("From inside of the function:", filteredNums)
    return filteredNums;
};


const exampleArray = [3, 2, 2, 3];
const element = 3;

console.log("Original array before:", exampleArray)
const result = removeElement(exampleArray, element);
console.log("Returning array:", result);
console.log("Original array after:", exampleArray)

Une chose qui peut vous tracasser est le fait que filteredNums ne change pas le tableau entrant , mais renvoie une copie du tableau d'origine sans éléments filtrés.


0 commentaires

3
votes

En supposant de supprimer des éléments du tableau, vous pouvez utiliser une approche différente en épissant le tableau.

En utilisant Array#splice , vous devez itérer à partir de la fin du tableau, car l'index change pour les éléments supprimés.

Enfin, vous devez renvoyer la nouvelle longueur du tableau.

/**
 * @param {number[]} nums
 * @param {number} val
 * @return {number}
 */

var removeElement = function(nums, val) {
    let i = nums.length;
    
    while (i--) if (nums[i] === val) nums.splice(i, 1);

    return nums.length;
};

var array = [3, 2, 2, 3];

console.log(removeElement(array, 3));

console.log(array);


1 commentaires

Excellente réponse, je l'ai votée. La seule chose à surveiller est que la modification des tableaux en place peut compliquer votre application et rendre le débogage plus difficile. S'il ne s'agit pas d'un gros problème de performances, il est souvent préférable de renvoyer une nouvelle baie mise à jour.



1
votes
  • La réponse de Nina est très bonne;

  • Nous pouvons également résoudre le problème sans utiliser de fonctions intégrées - en particulier pour les questions LeetCode faciles qui sont assez importantes (pour les interviews, pas les concours):

  • const removeElement = function(nums, val) {
        let lo = 0;
        let hi = nums.length - 1;
        while (lo <= hi) {
            if (nums[lo] === val) {
                swap(nums, lo, hi);
                hi -= 1;
            } else {
                lo += 1;
            }
        }
    
        return lo;
    };
    
    const swap = function(nums, left, right) {
        const temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
        return nums;
    };
    
    // console.log(removeElement(nums = [3,2,2,3], val = 3));
    

    Avertissement:

    • Je ne connais pas bien JavaScript;

1 commentaires

Excellente réponse, je l'ai votée. Il est logique de ne pas utiliser les éléments intégrés lors d'une entrevue, ou de les utiliser uniquement lorsque votre enquêteur est d'accord avec cela, et même dans ce cas, il faut savoir et être en mesure d'expliquer comment mettre en œuvre ces éléments intégrés si nécessaire.