2011-12-21 39 views

Trả lời

12

Tìm cách kiểm tra giao lộ giữa hai mảng sử dụng CoffeeScript chapter này. CoffeeScript có vẻ khá tuyệt vời khi nhìn vào điều này.

Nếu mảng kết quả sau giao điểm của các phần tử chứa ít nhất một mục thì cả hai mảng đều có phần tử chung.

intersection = (a, b) -> 
    [a, b] = [b, a] if a.length > b.length 
    value for value in a when value in b 

x = ["hello", "two", "three"] 
y = ["hello"] 

intersection x, y // ["hello"] 

Hãy dùng thử here.

+0

Hmmm, tôi khá bối rối bởi những dòng đầu tiên, và là một trong những lợi ích cốt lõi của CoffeeScript là được cho là tăng độ rõ ràng và dễ đọc của JS, phải không? Có lẽ đây là trường hợp của một số mã thông minh nhưng phức tạp, và chỉ nên được sử dụng nếu nó thực sự hiệu quả hơn mà mã rõ ràng hơn mà @alessioalex cung cấp. – GregL

+0

@GregL - ý bạn là dòng này - 'intersection = (a, b) ->'? – Anurag

+0

Xin lỗi, không, ý tôi là dòng # 2, là dòng đầu tiên của chức năng giao lộ. Tôi đã học được đủ cú pháp CS cho đến nay để có thể đọc dòng đầu tiên. :-) Đó là nhiều hơn mà tôi không hiểu làm thế nào mà dòng "hoạt động". – GregL

1

Tôi đã thực hiện một chức năng is_in, nhìn vào ví dụ của tôi:

array1 = ["hello","two","three"] 
array2 = ["hello"] 

is_in = (array1, array2) -> 
    for i in array2 
    for j in array1 
     if i is j then return true 

console.log is_in(array1, array2) 

Test here

Sau khi xem xét các ví dụ ngã tư, tôi có thể đạt được điều này theo một cách khác:

intersection = (a, b) -> 
    [a, b] = [b, a] if a.length > b.length 
    return true for value in a when value in b 

array1 = ["hello","two","three"] 
array2 = ["hello"] 

console.log intersection(array1, array2) 

Test here

+0

Trước đây dễ hiểu hơn nhiều - tôi sẽ tò mò nếu ai đó muốn tạo một bài kiểm tra jsPerf.com để xem liệu có bất kỳ lợi ích nào đối với mã giao lộ mà bạn đã đăng thứ hai hay không. – GregL

+0

Bạn có thể tự tạo thử nghiệm jsPerf. Nhấp vào hai liên kết 'Thử nghiệm tại đây' và sau đó lấy mã JavaScript được biên dịch từ đó. Sau đó tạo ra một jsPerf với 2 trường hợp. – alessioalex

1

Bạn có thể thử:

(true for value in array1 when value in array2).length > 0 
2
contains = (item for item in array2 when item in array1) 

(đảo ngược mảng để hiển thị các mục trong đôi array1)

7

Nghĩ rằng tôi sẽ ném coffeescript riêng tôi một lót điên rồ :-P

true in (val in array1 for val in array2) 
1

Chỉ trong trường hợp ai đó đến đây và đang tìm kiếm sự khác biệt như trái ngược với giao lộ

difference = (val for val in array1 when val not in array2) 

này sẽ cung cấp cho bạn một mảng (chênh lệch) của tất cả các giá trị trong array1 nhưng không phải trong array2

Các vấn đề liên quan