2012-01-10 53 views
23

Tôi có một mảng mà trông như thế này:Tìm kiếm đa chiều mảng JavaScript

selected_products[0]=["r1","7up",61,"Albertsons"] 
selected_products[1]=["r3", "Arrowhead",78,"Arrowhead "] 
selected_products[2]=["r8", "Betty Crocker Cake Mix (Variety)",109,"Arrowhead "] 
... 

làm thế nào tôi có thể tìm kiếm cho một mục trong mảng này theo mục đầu tiên trong từng hạng mục (r1, r2, ..) mảng là rất lớn tôi đang tìm kiếm một nhanh một cách hiệu quả để có được kết quả từ mảng này tôi đã sử dụng JQuery chức năng jQuery.inArray nhưng nó không thể tìm thấy bất cứ điều gì trong mảng của tôi, tôi đã sử dụng nó theo cách này:

alert($.inArray(["r1","7up",61,"Albertsons"],selected_products))// it returns -1 
alert($.inArray("r1",selected_products))//this also returns -1 
+1

Bạn không muốn quay trở lại mục mà bạn đang tìm kiếm, chỉ cần xác định xem nó có hay không? – Briz

+0

@Briz tôi muốn lấy chỉ mục của mục trong mảng whre nó có "r1" ví dụ –

+0

@AymanJitan Tôi đã cập nhật câu hỏi của mình, bây giờ nó có thể trả về danh sách tất cả các chỉ mục trong trường hợp có nhiều hơn một – ajax333221

Trả lời

39

Nếu bạn muốn nó nhanh, bạn sẽ muốn có vòng lặp for để bạn có thể ngắt vòng khi tìm thấy kết quả phù hợp.

var result; 
for(var i = 0, len = selected_products.length; i < len; i++) { 
    if(selected_products[i][0] === 'r1') { 
     result = selected_products[i]; 
     break; 
    } 
} 

Tất nhiên giả định này chỉ có một kết quả phù hợp.


Nếu có nhiều hơn một, sau đó bạn có thể sử dụng $.grep nếu bạn muốn jQuery:

var result = $.grep(selected_products, function(v,i) { 
    return v[0] === 'r1'; 
}); 

này sẽ cung cấp cho bạn một mảng mới mà là một tập hợp con của các mặt hàng phù hợp.


Tương tự, bạn có thể sử dụng Array.prototype.filter, nếu bạn chỉ hỗ trợ môi trường JavaScript hiện đại.

var result = selected_products.filter(function(v,i) { 
    return v[0] === 'r1'; 
}); 

Một giải pháp khác là tạo ra một đối tượng mà các phím là rn mục. Điều này sẽ cung cấp cho bạn một bảng tra cứu rất nhanh.

var r_table = {}; 
for(var i = 0, len = selected_products.length; i < len; i++) { 
    r_table[selected_products[i][0]] = selected_products[i]; 
} 

Sau đó làm tra cứu của bạn như thế này:

r_table.r4; 

Một lần nữa điều này giả định rằng không có trùng lặp rn mục.

+0

@AymanJitan : Vâng, một vòng lặp 'for' sẽ nhanh hơn nhiều so với những gì bạn có. Nhưng tôi vừa thêm một giải pháp khác ở phía dưới để tạo một đối tượng, do đó bạn có thể đơn giản tra cứu từng mục bằng khóa 'rn'. Tôi cho rằng bạn không có bản sao trong danh sách. –

+0

Nếu bạn chỉ muốn chỉ mục, thì trong giải pháp cuối cùng thay đổi 'r_table [selected_products [i] [0]] = selected_products [i];' thành 'r_table [selected_products [i] [0]] = i;' –

+0

@ AymanJitan Tôi nhận thấy bình luận của bạn nói rằng bạn muốn lấy chỉ mục, bạn cần trả lại 'i' cho số – ajax333221

0

Bạn có thể tạo đối tượng chỉ mục {r1: 1, r2: 2 ,. .., < phím tìm kiếm>: < chỉ mục phần tử>, ...} và sử dụng nó để tìm kiếm.

3

Vì vậy, bạn đang cố gắng để tìm ra chỉ số của các kết quả phù hợp ?, cũng làm thay đổi những điều một chút:

var index=-1; 

for(var i = 0, len = selected_products.length; i < len; i++){ 
    if(selected_products[i][0] === "r1"){ 
     index = i; 
     break; 
    } 
} 
if(index > -1){ 
    alert(selected_products[index].join(","));//"r1,7up,61,Albertsons" 
} 

Lưu ý: này sẽ trả lại kết quả đầu tiên xuất hiện, nếu bạn muốn có được một mảng chứa một danh sách của tất cả các chỉ số:

var results=[]; 

for(var i = 0, len = selected_products.length; i < len; i++){ 
    if(selected_products[i][0] === "r1"){ 
     results.push(i); 
    } 
} 

sau đó bạn có thể gọi số (ví dụ) cuối cùng 'r1' phù hợp như thế này selected_products[results[results.length-1]].join(",");

+0

Tôi quên đặt' if (results.length> 0) 'trên ví dụ cuối cùng của tôi. Nhưng tôi sẽ để nó theo cách này, vì nó chỉ là một ví dụ về cách gọi nó – ajax333221

0

Hãy thử điều này,

// returns the index of inner array, if val matches in any array 
function findIn2dArray(arr_2d, val){ 
    var indexArr = $.map(arr_2d, function(arr, i) { 
      if($.inArray(val, arr) != -1) { 
       return 1; 
      } 

      return -1; 
    }); 

    return indexArr.indexOf(1); 
} 


function test(){ 
    alert(findIn2dArray(selected_products, 'r8')); 
} 
2

Bạn có thể muốn cân nhắc không làm những việc này trong Javascript nhưng trong một máy chủ ngôn ngữ mặt (PHP/Java/.NET).Bằng cách này bạn:

  • Sẽ không có vấn đề với incapabilities trình duyệt (Chủ yếu là lỗi IE) mã Javascript
  • ngắn hơn và do đó nhanh hơn để tải.
  • Trang web của bạn cũng hoạt động với Javascript bị tắt.

Một ví dụ làm thế nào để làm điều này trong PHP:

<?php 
function search($array, $key, $value) 
{ 
    $results = array(); 

    if (is_array($array)) 
    { 
     if (isset($array[$key]) && $array[$key] == $value) 
      $results[] = $array; 

     foreach ($array as $subarray) 
      $results = array_merge($results, search($subarray, $key, $value)); 
    } 

    return $results; 
} 
?> 
2

Chỉ cần nhấc @am không tôi đầu vào lớn của. Đây là một ví dụ trực tiếp. Anh giải quyết nó. Tôi chỉ muốn đưa ra một ví dụ rằng nó hoạt động. Hy vọng nó giúp. Điều này đặt các giá trị được tìm thấy từ giá trị đã chọn trong 2 trường nhập.

http://jsfiddle.net/asle/ZZ78j/2/

$(document).ready(function() { 
var liste = []; 
liste[0] = ["First Name", "12345678", "[email protected]"]; 
liste[1] = ["Second Name", "20505050", "second.nametestdomain.no"]; 
liste[2] = ["", "", ""]; 
$("#selger").change(function() { 
    var valg = ($(this).val()); 
    var telefon; 
    var epost; 
    for (var i = 0, len = liste.length; i < len; i++) { 
     if (liste[i][0] === valg) { 
      telefon = liste[i][1]; 
      epost = liste[i][2]; 
      $("#tel").val(telefon); 
      $("#epost").val(epost); 
      break; 
     } 
    } 
}); 

});