web-dev-qa-db-fra.com

JavaScript prend-il en charge la compréhension de tableaux/listes comme Python?

Je pratique/étudie à la fois JavaScript et Python. Je me demande si Javascript a l'équivalent de ce type de codage.

J'essaie essentiellement d'obtenir un tableau de chaque entier individuel de la chaîne à des fins de pratique. Je suis plus compétent en Python qu'en JavaScript

Python:

string = '1234-5'

forbidden = '-'

print([int(i) for i in str(string) if i not in forbidden])

Javascript a-t-il quelque chose de similaire à faire ci-dessus?

26
A K

Mise à jour: Les compréhensions de tableaux ont été supprimées de la norme. Citant MDN :

La syntaxe de compréhension de tableau est non standard et a été supprimée à partir de Firefox 58. Pour les utilisations futures, envisagez d'utiliser Array.prototype.map, Array.prototype.filter, les fonctions de flèche et la syntaxe de propagation.

Réponse originale:

Oui, JavaScript prendra en charge la compréhension des tableaux dans la prochaine version d'EcmaScript 7: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Array_comprehensions .

Voici un exemple: Array Comprehensions .

var str =  "1234-5";
var ignore = "-";

console.log([for (i of str) if (!ignore.includes(i)) i]);
7
DRD

En lisant le code, je suppose qu’interdit peut avoir plus d’un caractère. Je suppose également que la sortie devrait être "12345"

var string = "12=34-5";

var forbidden = "=-";

console.log(string.split("").filter(function(str){
    return forbidden.indexOf(str) < 0;
}).join(""))

Si la sortie est "1" "2" "3" "4" "5" sur des lignes séparées

var string = "12=34-5";

var forbidden = "=-";

string.split("").forEach(function(str){
    if (forbidden.indexOf(str) < 0) {
        console.log(str);
    }
});
8
Jaromanda X

Pas directement, mais ce n'est pas difficile à reproduire.

var string = "1234-5";

var forbidden = "-";

string.split("").filter(function(str){
    if(forbidden.indexOf(str) < 0) {
        return str;
    }
}).forEach(function(letter) { console.log(letter);});

Je suppose plus directement:

for(var i=0 ; i < str.length ; i++) {
    if(forbidden.indexOf(str) < 0) {
        console.log(str[i]);
    }
}

Mais il n'y a pas de moyen intégré pour filtrer dans votre boucle for.

4
ChadF

Vous pouvez facilement obtenir ce comportement en utilisant un foncteur d’application.

Array.prototype.ap = function(xs) {
  return this.reduce((acc, f) => acc.concat(xs.map(f)), []) 
}


const result = [x => x +1].ap([2])
console.log(result)
3
martin

Pour "compléter", voici une version plus courte de l'expression rationnelle.

var str =  "1234-5";
var ignore = "-=";

console.log(str.replace(new RegExp(ignore.split("").join("|")), "").split(""));

EDIT: Pour être sûr que RegExp ne "s'étouffe" pas sur des caractères spéciaux, ignore peut être implémenté comme littéral regexp, au lieu d'une chaîne:

var str =  "1234-5";
var ignore = /[\+=-]/;
console.log(str.replace(ignore, "").split(""));
2
DRD

JavaScript ne prend plus en charge les compréhensions de tableaux.

Moi aussi, je cherchais l'équivalent JavaScript. Le réseau du développeur Mozilla indique que cette fonctionnalité n'est plus prise en charge. La syntaxe préférée est référencée dans le lien susmentionné.

2
VanBantam

Étant donné le code Python de la question

print([int(i) for i in str(string) if i not in forbidden])

c'est la plus traduction directe en JavaScript (ES2015):

const string = '1234-5';
const forbidden = '-';

console.log([...string].filter(c => !forbidden.includes(c)).map(c => parseInt(c)));
// result: [ 1, 2, 3, 4, 5 ]

Voici une comparaison des éléments de code Python et JavaScript utilisés: (Python -> Javascript):

  • print -> console.log
  • itérer sur les caractères d'une chaîne -> opérateur d'étalement
  • liste compréhension 'si' -> Array.filter
  • liste compréhension 'pour' -> Array.map
  • substr in str? -> string.includes
1
Colin D Bennett

Il a une mauvaise version de l'homme

const string = '1234-5'

const forbidden = '-'

print([int(i) for i in str(string) if i not in forbidden])
const result = string.split('').filter(char => char !== forbidden);
console.log(result)

Dans JS, vous ne pouvez effectuer une itération que sur des éléments uniques d'un tableau. Par conséquent, aucune extraction de plusieurs entrées à la fois, comme en Python.

Dans ce cas particulier, vous devez utiliser un RegExp pour filtrer la chaîne.

0
Henrik Vendelbo