2015-07-11 14 views
17

Tôi đang thực hành/nghiên cứu cả JavaScript và Python. Tôi tự hỏi nếu Javascript có tương đương với loại mã hóa.JavaScript có hỗ trợ hiểu biết mảng/danh sách như Python không?

Tôi đang cố gắng lấy một mảng từ mỗi số nguyên riêng lẻ từ chuỗi cho mục đích thực hành. Tôi thành thạo hơn trong Python hơn JavaScript

Python:

string = '1234-5' 

forbidden = '-' 

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

Liệu Javascript có một cái gì đó tương tự như đối với tôi để làm trên?

+0

Không có. Mặc dù JavaScript hỗ trợ [các hàm có thứ tự cao hơn] (https://en.wikipedia.org/wiki/Higher-order_function) và ES5 thêm hỗ trợ cho một số hỗ trợ bản đồ/bộ lọc cơ bản trong Array.prototype (không có flatmap trực tiếp, mặc dù có thể được mô phỏng bản đồ-concat). Có các thư viện bổ sung như gạch dưới mà thêm vào tập hợp các 'nguyên thủy' đó là tất cả Python đang làm theo cú pháp cú pháp danh sách hiểu. – user2864740

+0

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

Trả lời

8

Vâng, JavaScript sẽ hỗ trợ sự hiểu biết mảng trong phiên bản EcmaScript sắp tới 7: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Array_comprehensions.

Dưới đây là ví dụ: Array Comprehensions.

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

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

Tôi tin rằng OP đã hỏi về mã JavaScript mà họ thực sự có thể chạy ngày hôm nay, không phải tại một số thời gian vô hạn trong tương lai. –

+2

Bộ biên dịch của Babel.js hỗ trợ khả năng đọc: https://babeljs.io/repl/. – DRD

+1

Babel thật tuyệt! Có lẽ bạn có thể mở rộng câu trả lời của bạn một chút và đưa ra một ví dụ về cú pháp sẽ là gì, và cách bạn có thể sử dụng Babel để sử dụng nó trong các trình duyệt ngày nay. –

4

Không trực tiếp nhưng không sao chép được.

var string = "1234-5"; 

var forbidden = "-"; 

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

Tôi đoán trực tiếp hơn:

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

Nhưng không có xây dựng theo cách để lọc trong cho bạn vòng lặp.

8

Đọc mã, tôi cho rằng bị cấm có thể có nhiều hơn 1 ký tự. Tôi cũng giả định sản lượng nên được "12345"

var string = "12=34-5"; 

var forbidden = "=-"; 

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

Nếu đầu ra là "1" "2" "3" "4" "5" trên dòng riêng biệt

var string = "12=34-5"; 

var forbidden = "=-"; 

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

Đối với trường hợp "đầy đủ", đây là phiên bản regexp ngắn hơn.

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

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

EDIT: Để chắc chắn rằng RegExp không "nghẹt thở" trên ký tự đặc biệt, ignore có thể được thực hiện như regexp đen, thay vì một chuỗi:

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

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

+0

Dang, tôi thực sự thích giải pháp của bạn cũng; nó rơi nhiều hơn trong loại mã hóa của tôi –

+0

@MichaelGeary: xem cập nhật của tôi. – DRD

0

Nó có một phiên bản mans nghèo

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) 

Trong JS bạn chỉ có thể lặp qua nhiều phần tử trong mảng, do đó không trích xuất nhiều mục vào một thời điểm như trong Python.

Đối với trường hợp cụ thể này, bạn nên sử dụng RegExp để lọc chuỗi mặc dù.

1

Bạn có thể dễ dàng đạt được hành vi này bằng cách sử dụng trình ứng dụng.

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

Do của câu hỏi mã Python

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

đây là hầu hết trực tiếp dịch 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 ]

Dưới đây là một so sánh của t ông Python và các yếu tố mã JavaScript được sử dụng: (Python -> Javascript):

  • in -> console.log
  • lặp qua ký tự trong một chuỗi ->spread operator
  • danh sách hiểu biết 'nếu' - >Array.filter
  • danh sách hiểu 'cho' ->Array.map
  • chất nền trong str? -> string.includes
Các vấn đề liên quan