2015-11-30 3 views
2

Je crée quelques fonctions spécifiques pour un compilateur sur lequel je travaille, mais certaines restrictions dans la nature du compilateur m'empêcheront d'utiliser des méthodes JavaScript natives comme Array.prototype.pop() pour effectuer des pops de tableau. J'ai donc décidé d'essayer d'écrire un pseudo-code rudimentaire pour essayer d'imiter le processus, puis de baser ma fonction finale sur le pseudo-code ... Mais mes tests semblent échouer ... sur la base du Comportement actuel du compilateur, il me permettra seulement d'utiliser array.length, les attributions d'éléments de tableau et c'est à ce sujet ... Mon code est ci-dessous ...JavaScript restreint Array Pop Polyfill ne fonctionne pas

pop2 = function(arr) { 
    if(arr.length>0){ 
     for(var w=undefined,x=[],y=0,z=arr.length;y<=z;y++){ 
      y+1<z?(x[y]=arr[y]):(w=arr[y],arr=x); 
     } 
    } 
    return w; 
} 
Arr = [-1,0,1,2]; 

// Testing... 
console.log(pop2(Arr)); // undefined... should be 2 
console.log(Arr); // [-1,0,1,2]... should be [-1,0,1] 

J'essaie d'imiter la nature de la fonction pop mais je n'arrive pas à mettre le doigt sur ce qui cause la fonction à fournir undefined et le tableau original ... undefined ne devrait retourner que si un tableau vide initial est envoyé, tout comme vous attendez avec un [].pop() appel ...

Quelqu'un at-il des indices sur la façon dont je peux adapter ce code pour imiter la pop correctement?

Et même si j'ai entendu dire que arr.splice(array.length-1,1)[0]; peut fonctionner ... le compilateur n'est actuellement pas capable de déterminer splice ou des méthodes similaires ... Est-il possible de le faire en utilisant une variation de mon code?

Merci à l'avance ...

Répondre

2

Vous êtes vraiment trop penser [].pop(). As defined in the specs, le processus de [].pop() est:

  1. obtenir la longueur du tableau
  2. Si la longueur est 0
    1. retour undefined
  3. Si la longueur est supérieure à 0
    1. Obtenir l'article au length - 1
    2. Réduire array.length par 1
    3. Renvoyer l'article.

(... plus quelques choses que le moteur JavaScript doit faire dans les coulisses comme appel ToObject sur le tableau ou assurer la longueur est un entier de 32 bits non signé.Cela peut être fait avec une fonction aussi simple que celle ci-dessous, il n'y a même pas besoin d'une boucle.

function pop(array) { 

    var length = array.length, 
     item; 

    if (length > 0) { 

     item = array[length - 1]; 
     array.length -= 1; 

    } 

    return item; 

} 

Modifier

Je suppose que la question avec le compilateur est que Array.prototype.pop n'est pas compris du tout. Relisant votre publication, il semble que les tableaux ont une méthode pop, mais le compilateur ne peut pas déterminer si la variable est un tableau ou non. Dans ce cas, une version encore plus simple de cette fonction serait la suivante:

function pop(array) { 
    return Array.prototype.pop.call(array); 
} 

Essayez cette première que ce sera un peu plus rapide et plus robuste, si cela fonctionne. C'est aussi le modèle pour toute autre méthode de tableau que vous pourriez avoir besoin d'utiliser.

0

Avec cette modification, il fonctionne:

http://jsfiddle.net/vxxfxvpL/1/

pop2 = function(arr) { 
    if(arr.length>0){ 
     for(var w=undefined,x=[],y=0,z=arr.length;y<=z;y++){ 
      if(y+1<z) { 
       (x[y]=arr[y]); 
      } else { 
       (w=arr[y],arr=x); 
       break; 
      } 
     } 
    } 
    return w; 
} 
Arr = [-1,0,1,2]; 

// Testing... 
console.log(pop2(Arr)); // 2 

Le problème est maintenant de supprimer le dernier élément. Vous devez reconstruire le tableau d'origine sans le dernier élément. Vous aurez des problèmes avec ceci parce que vous ne pouvez pas modifier le tableau original. C'est pourquoi ces tâches sont faites avec prototype (Array.prototype.pop2 peut-être peut vous aider)