2015-07-11 9 views
17

Ćwiczę/studiuję zarówno JavaScript, jak i Python. Zastanawiam się, czy JavaScript ma odpowiednik tego typu kodowania.Czy obsługa JavaScript obsługuje tablice/listy, takie jak Python?

Zasadniczo próbuję uzyskać tablicę z każdej liczby całkowitej z ciągu znaków w celach ćwiczeniowych. Jestem bardziej biegły w Pythonie niż JavaScript

Python:

string = '1234-5' 

forbidden = '-' 

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

Does Javascript mieć coś podobnego do mnie, aby zrobić powyżej?

+0

Nie, nie ma. Chociaż JavaScript obsługuje funkcje wyższego rzędu (https://en.wikipedia.org/wiki/Higher-order_function), a ES5 dodaje obsługę podstawowej obsługi map/filtru w postaci Array.prototype (nie ma bezpośredniej mapy, chociaż który może być emulowany map-concat). Istnieją dodatkowe biblioteki, takie jak podkreślenia, które dodają do tego zestawu "prymitywów", które wszystkie Python robi pod pozorem składni-rozumienia składni. – user2864740

+0

Zobacz http://stackoverflow.com/questions/33872615/are-es6-array-comprehensions-no-longer-valid –

Odpowiedz

8

Tak, JavaScript obsługuje tłumaczenia tablicowe w nadchodzącej wersji EcmaScript 7: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Array_comprehensions. Jest to przykład: Array Comprehensions.

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

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

Uważam, że OP pytał o kod JavaScript, który mogą faktycznie uruchomić dzisiaj, a nie w nieskończoność w przyszłość. –

+2

Transcompiler Babel.js obsługuje następujące funkcje: https://babeljs.io/repl/. – DRD

+1

Babel jest świetny! Może mógłbyś nieco poszerzyć swoją odpowiedź i podać przykład tego, jaka będzie składnia i jak używać Babel do korzystania z niej w dzisiejszych przeglądarkach. –

4

Nie bezpośrednio, ale nie jest trudno replikować.

var string = "1234-5"; 

var forbidden = "-"; 

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

Chyba bardziej bezpośrednio:

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

Ale nie ma zbudowany w sposób filtrować w swoim pętli for.

8

Czytanie kodu, zakładam, że zabronione może mieć więcej niż 1 znak. Ja też zakładając wyjście powinno być "12345"

var string = "12=34-5"; 

var forbidden = "=-"; 

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

Jeśli wyjście jest "1" "2" "3" "4", "5" na oddzielnych liniach

var string = "12=34-5"; 

var forbidden = "=-"; 

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

Dla "kompletności" - oto krótsza wersja regexp.

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

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

EDIT: Aby upewnić się, że RegExp nie „dusić” na znaki specjalne, ignore mogą być realizowane jako regexp dosłownym, zamiast napisu:

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

'var ignore =" - + = ";' –

+0

Dang, bardzo podoba mi się twoje rozwiązanie także; bardziej pasuje do mojego rodzaju kodowania –

+0

@MichaelGeary: zobacz moją aktualizację. – DRD

0

To ma słabą wersję mans

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) 

w JS można iteracyjne tylko na pojedynczych elementów w tablicy, więc nie ekstrakcji wielu wpisów w takiej chwili w Pythonie.

W tym konkretnym przypadku należy jednak użyć RegExp do filtrowania ciągu znaków.

1

Możesz łatwo osiągnąć to zachowanie za pomocą funktora aplikacji.

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) 
0

Zważywszy na pytanie Kod Python

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

jest to najbardziej bezpośredni tłumaczenie do 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 ]

Oto porównanie z t on Python i elementy kodu JavaScript używany: (Python -> JavaScript):

  • wydruku -> console.log
  • iteracyjne nad ciąg znaków ->spread operator
  • listowych 'if' - >Array.filter
  • wymienienie listy "za" ->Array.map
  • substr in str? -> string.includes
Powiązane problemy