2010-07-07 8 views
9

Câu hỏi đặt ra là gì ...Có bất kỳ tính năng jquery nào để truy vấn mảng đa chiều theo cách tương tự với DOM không?

jQuery có bất kỳ phương pháp nào cho phép bạn truy vấn mảng nhiều chiều của đối tượng theo cách tương tự với DOM không.

Vì vậy, ví dụ, làm cho tôi một danh sách các đối tượng chứa trong một mảng đa chiều có một số giá trị tài sản phù hợp - ví dụ nơi StartOfPeriod lớn hơn một ngày quy định hoặc trong trường hợp tên == "Ben Alabaster"

tôi muốn tránh tái phát minh ra bánh xe nếu có thứ gì đó ở ngoài kia.

+6

+1 câu hỏi thú vị – alex

+0

Vậy bạn sẽ hình dung ra điều này như thế nào? '$ (obj) .find (" * [StartOfPeriod = 'Ben Alabaster'] ");'? –

+0

@ Dan Heberden - Tôi đã không hình dung ra nó tìm kiếm bất kỳ cách nào cụ thể bởi tôi đoán, nhưng cú pháp bạn đề nghị sẽ là đủ tốt, tôi giả sử. – BenAlabaster

Trả lời

6

Bạn không thể sử dụng cú pháp chọn, nhưng jQuery đi kèm với $.grep$.inArray, điều này có thể hữu ích cho việc này. grep trả về một mảng các phần tử mới khớp với vị từ. inArray trả về chỉ mục của phần tử khớp đầu tiên, hoặc -1. Ví dụ:

var matches = $.grep(array, function(el){ 
    return el.StartOfPeriod > 2000; 
}); 

Đây là giống với phương pháp ECMAScript tiêu chuẩn, Array.filter (simimlar để grep) và Array.indexOf (tương tự như inArray); jQuery thực sự sử dụng Array.indexOf nếu có. Ngoài ra còn có các phương pháp ECMAScript hữu ích khác, chẳng hạn như Array.every (tất cả các phần tử phù hợp) và Array.some (ít nhất một kết hợp). MDC có mã mà bạn có thể thêm vào dự án của mình để các công việc này trong các trình duyệt không có triển khai gốc.

+0

Điều đó hoạt động tốt trên mảng thứ nguyên duy nhất và tôi đã xem xét điều này và tôi có thể sử dụng nó làm cơ sở cho plugin, nhưng tôi tự hỏi liệu có điều gì đó đã tồn tại để xử lý mảng đa chiều không - 2D, 3D vv – BenAlabaster

2

Bạn có thể tìm thấy một plugin, nhưng không phải trong lõi jQuery. Có một số phương thức mảng hữu ích: each, unique, inArray. Kết hợp, bạn có thể tạo ra một cái gì đó tùy chỉnh để đáp ứng nhu cầu của bạn.

Những gì bạn đang tìm kiếm là nhiều thư viện được đặt bằng xpath giống như traversal. Prototype có một tập hợp các phương thức mảng lớn hơn nhiều. Nhưng vẫn có thể sẽ không đáp ứng nhu cầu chính xác của bạn ra khỏi hộp.

Tôi đồng ý với alex, thư viện/tiện ích mở rộng như vậy sẽ rất thú vị.

+0

Tôi đang xem xét viết phần mở rộng cho biết, nhưng tôi không muốn phát minh lại bánh xe không cần thiết. – BenAlabaster

+1

Điều này chắc chắn sẽ là một phần mở rộng tuyệt vời. Tôi có thể bắt đầu viết trong thời gian rảnh rỗi * snicker * của tôi. –

+1

@Ryan Kinal: Chỉ cần tìm một cái cớ để cần một cho một khách hàng của bạn;) Tôi chỉ đang cố gắng tìm ra những gì tôi muốn cú pháp chọn giống như, có lẽ giống như cú pháp thông thường. Nếu bạn nhận được như xa như mã hóa một cái gì đó, có lẽ chúng ta có thể trả lại một số ý tưởng tắt nhau. – BenAlabaster

1

tôi chỉ viết này .. Tôi nghĩ rằng nó hoạt động bình thường nhưng nó chắc chắn có thể bị dọn dẹp :)

function findMatchingObjects(obj, member, value){ 
    var final = new Array(); 
    var temp = new Array(); 
    for(var p in obj){ 
    if (typeof obj[p] == 'object') { 
    temp = findMatchingObjects(obj[p], member, value); 
    if (temp.length == 1) 
     final.push(temp[0]); 
    } 
    if (p == member && obj[p] == value) { 
    final.push(obj); 
    } 
    } 
    alert(final.length); 
    return final; 
} 

Sử dụng nó như vậy:

var moo ={baz: 1, boo: 2, bar:{c1: 3, c2: 4, c3:{t:true, f:false, baz:1}},d: 11}; 
var foo = findMatchingObjects(moo, "baz", 1); 

// did it work? 
console.log(foo); 

Trả về một mảng các đối tượng (hoặc các đối tượng phụ) khớp với cặp giá trị thành viên. Trong trường hợp này, foo chứa cả hai mooc3 vì cả hai đối tượng đều chứa một cặp baz = 1.

Làm cho giao diện chức năng giống như bộ chọn jQuery chỉ là vấn đề đường cú pháp.

+0

Tôi đã có một cái gì đó rất tương tự gõ lên quá, tôi chỉ cố gắng để mod nó để tôi có thể cắm nó vào jQuery với cú pháp chọn. Tôi đã không viết bất kỳ plugin jQuery trước đây, vì vậy tôi chỉ đang cố gắng để quấn đầu của tôi xung quanh đó. – BenAlabaster