2013-08-10 17 views
5

Làm việc trên thử thách lập trình để triển khai lại chức năng của underscore.js trong javascript chuẩn. Cụ thể là tôi đang làm việc để triển khai hàm _.some. (http://underscorejs.org/#some) Phần tôi đang đấu tranh là yêu cầu tôi tìm cách giải quyết nó bằng cách sử dụng _.every nội bộ. (http://underscorejs.org/#every)Cách giải quyết _.some bằng _.every?

Tôi đã hoàn thành chức năng _.every trước đó và hoạt động bình thường.

Đây là một cách logic những gì tôi đang muốn làm trong mã phác thảo:

_.some = function(collection, truthStatementFunction) { 
    return !(_every(collection, !truthStatementFunction)) 
} 

Hoặc bằng tiếng Anh, lật tuyên bố sự thật để kiểm tra nơi điều kiện là sai ... và nếu thử nghiệm _.every sau đó trả về true ... sau đó chúng tôi biết rằng _ một số báo cáo sự thật ban đầu là sai (do đó, lật lại sự trở lại của _.every để nhận được khoản hoàn trả chính xác cho _some). Tương tự, nếu _.every trả về giá trị false thì hãy lật để có được trả lại giá trị đúng cho _.some.

Rõ ràng vấn đề với bản phác thảo này là phần !truthStatementFunction. Làm thế nào để tôi nhận được bên trong mà iterator để thay đổi internals của chức năng để lật nó? Dường như không thể truy cập nội bộ của chức năng ...

Tôi có đang sủa hoàn toàn cây không và có cách nào tốt hơn để giải quyết vấn đề này bằng cách sử dụng _.every?

+1

Bạn có ý tưởng đúng. Tuy nhiên, bạn cần phải [soạn] (https://en.wikipedia.org/wiki/Function_composition) toán tử '!' Và hàm; nó giống như 'function (x) {return! truthStatementFunction (x)}' thay vì chỉ '! truthStatementFunction'. –

+1

Để trả lời câu hỏi của bạn ... Đó là một bài tập học tập nên điểm là học, theo cách này hay cách khác (mặc dù tôi biết tự mình giải quyết nó 100% sẽ là cách hiệu quả nhất để học, bị kẹt quá lâu và lãng phí thời gian rằng tôi có thể chi tiêu học những thứ hữu ích khác không kém cho tôi. Tôi muốn nhận được một gợi ý ở đây chứ không phải là một câu trả lời hoàn toàn, nhưng tôi đã không chắc chắn nếu điều đó sẽ chạy afoul của quy tắc dường như nghiêm ngặt tràn ngăn xếp. – jjj

Trả lời

9

đèo _every một hàm trả về một đảo của kết quả từ truthStatementFunction:

_.some = function(collection, truthStatementFunction) { 
    return !(_every(collection, function(v) { 
     return !truthStatementFunction(v); 
    })); 
} 

Để trả lời phần thứ hai của câu hỏi của bạn:

và là có một cách tốt hơn để giải quyết việc này bằng _.mỗi?

Chắc chắn có cách tốt hơn để giải quyết vấn đề này bằng cách sử dụng _.every. Chỉ cần lặp lại bộ sưu tập và trả về true ngay khi bạn tìm thấy bất kỳ phần tử nào phù hợp. Hiệu quả hơn nhiều trong trường hợp _.some sẽ trả về true vì bạn không thực sự quan tâm có bao nhiêu phần tử trong bộ sưu tập thỏa mãn vị từ, miễn là có ít nhất một phần tử.

_.some = function(c, pred) { 
    for(var i = 0; i < c.length; i++) { 
     if (pred(c[i])) return true; 
    } 
    return false; 
} 
+0

Cảm ơn! Với tất cả các phạm vi mà tôi đã nhìn thấy, tôi đã quên rằng tôi có thể xác định rõ ràng hàm tôi đã chuyển vào _.every (_.every là chính nó bằng cách sử dụng _.reduce trong nội bộ để thỏa mãn thử thách, vì vậy các phạm vi bắt đầu gây nhầm lẫn một chút !) Bằng cách cuối cùng tôi đã hỏi liệu có cách nào tốt hơn để giải quyết việc sử dụng _.every, không sử dụng _every ... Tôi đồng ý một vòng lặp sẽ đơn giản hơn nhiều so với tất cả điều này! – jjj

+0

@ggg Lý do tôi đề xuất một vòng lặp không phải là sự đơn giản, mà là hiệu quả. Sử dụng phương pháp '_.every' là * rất nhiều * chậm hơn (trung bình) so với lặp lại đơn giản. –