Javascript có chức năng tương tự như Ruby không?
array.select {|x| x > 3}
Cái gì đó như:
array.select(function(x) { if (x > 3) return true})
Javascript có chức năng tương tự như Ruby không?
array.select {|x| x > 3}
Cái gì đó như:
array.select(function(x) { if (x > 3) return true})
Câu trả lời:
Có Array.filter()
:
var numbers = [1, 2, 3, 4, 5];
var filtered = numbers.filter(function(x) { return x > 3; });
// As a JavaScript 1.8 expression closure
filtered = numbers.filter(function(x) x > 3);
Lưu ý rằng đó Array.filter()
không phải là ECMAScript tiêu chuẩn và nó không xuất hiện trong thông số kỹ thuật ECMAScript cũ hơn ES5 (cảm ơn Yi Jiang và jAndy). Do đó, nó có thể không được hỗ trợ bởi các phương ngữ ECMAScript khác như JScript (trên MSIE).
Cập nhật tháng 11 năm 2020 : Array.filter hiện được hỗ trợ trên tất cả các trình duyệt chính.
Underscore.js là một thư viện tốt cho các loại hoạt động này - nó sử dụng các thủ tục nội trang như Array.filter nếu có, hoặc sử dụng các thủ tục của chính nó nếu không.
http://documentcloud.github.com/underscore/
Tài liệu sẽ đưa ra ý tưởng về cách sử dụng - cú pháp lambda của javascript không ngắn gọn như ruby hoặc những thứ khác (tôi luôn quên thêm câu lệnh trả về rõ ràng chẳng hạn) và phạm vi là một cách dễ dàng khác để nhận ra, nhưng bạn có thể làm hầu hết mọi thứ khá dễ dàng, ngoại trừ các cấu trúc như hiểu danh sách lười biếng.
Từ tài liệu cho .select () ( .filter () là một bí danh cho cùng một)
Xem qua từng giá trị trong danh sách, trả về một mảng gồm tất cả các giá trị vượt qua kiểm tra sự thật (trình lặp). Đại diện cho phương pháp bộ lọc gốc, nếu nó tồn tại.
var evens = _.select([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
=> [2, 4, 6]
bạn có thể mở rộng JS của bạn bằng một phương thức chọn lọc như thế này
Array.prototype.select = function(closure){
for(var n = 0; n < this.length; n++) {
if(closure(this[n])){
return this[n];
}
}
return null;
};
bây giờ bạn có thể sử dụng cái này:
var x = [1,2,3,4];
var a = x.select(function(v) {
return v == 2;
});
console.log(a);
hoặc cho các đối tượng trong một mảng
var x = [{id: 1, a: true},
{id: 2, a: true},
{id: 3, a: true},
{id: 4, a: true}];
var a = x.select(function(obj) {
return obj.id = 2;
});
console.log(a);
Cũng có Array.find()
trong ES6 trả về phần tử phù hợp đầu tiên mà nó tìm thấy.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find
const myArray = [1, 2, 3]
const myElement = myArray.find((element) => element === 2)
console.log(myElement)
// => 2
Array.filter không được thực hiện trong nhiều trình duyệt, Tốt hơn là nên xác định hàm này nếu nó không tồn tại.
Mã nguồn của Array.prototype được đăng trong MDN
if (!Array.prototype.filter)
{
Array.prototype.filter = function(fun /*, thisp */)
{
"use strict";
if (this == null)
throw new TypeError();
var t = Object(this);
var len = t.length >>> 0;
if (typeof fun != "function")
throw new TypeError();
var res = [];
var thisp = arguments[1];
for (var i = 0; i < len; i++)
{
if (i in t)
{
var val = t[i]; // in case fun mutates this
if (fun.call(thisp, val, i, t))
res.push(val);
}
}
return res;
};
}
xem https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter để biết thêm chi tiết