2012-05-02 37 views
51

tôi không thể tìm ra tương đương javascript của php array_keys()/array_values()phím băm/giá trị như mảng

Đối với những người không quen với php trao băm sau js:

var myHash = {"apples": 3, "oranges": 4, "bananas": 42} 

Làm thế nào tôi có thể nhận được một loạt các phím , tức là

["apples", "oranges", "bananas"] 

câu hỏi tương tự với các giá trị, tức là

[3, 4, 42] 

jQuery có thể được sử dụng.

+0

thể trùng lặp của [Lấy mảng khóa của đối tượng] (http://stackoverflow.com/questions/8763125/get-array- của các đối tượng-chìa khóa) và [Làm thế nào để có được tất cả các giá trị tài sản của một đối tượng Javascript (mà không biết các phím)?] (http://stackoverflow.com/questions/7306669/how-to-get-all-properties-values -of-a-javascript-đối tượng-không-biết-chìa khóa). –

Trả lời

44
var a = {"apples": 3, "oranges": 4, "bananas": 42};  

var array_keys = new Array(); 
var array_values = new Array(); 

for (var key in a) { 
    array_keys.push(key); 
    array_values.push(a[key]); 
} 

alert(array_keys); 
alert(array_values); 
+8

+1, Tuy nhiên, bên trong của vòng lặp 'for' nên được bọc trong một kiểm tra rằng khóa hiện tại thực sự là đối tượng trong thuộc tính riêng của câu hỏi (trái ngược với một thuộc tính kế thừa). Khác, trong IE, bạn có thể nhận được một số khóa không mong muốn: 'if (Object.prototype.hasOwnProperty.call (a, key)) {array_keys.push (khóa); array_values.push (a [key]);}' – JAAulde

+0

@ JAAulde: Tôi không biết về bất kỳ vấn đề nào về IE như vậy. khi liệt kê một đối tượng. Bạn có thể mô tả thêm về vấn đề đó không? Phím nào sẽ được tìm thấy? –

+0

@amnotiam Crockford đề xuất nó trong hướng dẫn LINT của mình tại http://www.JSLint.com/lint.html#forin và tham khảo một bài viết ông đã viết về vấn đề này tại http://yuiblog.com/blog/2006/09/ 26/for-in-intrigue/ – JAAulde

59

Trong ES5 hỗ trợ (hoặc shimmed) trình duyệt ...

var keys = Object.keys(myHash); 

var values = keys.map(function(v) { return myHash[v]; }); 

shims từ MDN ...

+0

+1, bạn có thể xây dựng trên các trình duyệt này không? – greg0ire

+0

@ greg0ire: Trình duyệt được hỗ trợ thường là bất kỳ trình duyệt hiện đại nào. Nói chung, hầu hết Chrome và Safari được sử dụng, Firefox 4+, Opera 10+ * (có thể sớm hơn?) * Và IE9. Bạn có thể dễ dàng shim cả hai phương pháp này để hỗ trợ các trình duyệt cũ. –

+0

@ greg0ire: Tôi đã thêm các liên kết vào các miếng chêm được cung cấp bởi MDN. –

1

Không biết nếu nó giúp, nhưng "foreach" đi qua tất cả các phím: for (var quan trọng trong obj1) {...}

+0

+1, nó giúp – greg0ire

+1

Xem ra đối tượng kiểu "jquery/prototype": các thư viện này thêm các hàm khác nhau cho tất cả các đối tượng đang được lặp lại thông qua như thể chúng cũng là các khóa ... Trong trường hợp này, bạn muốn sử dụng hàm Object.each() được cung cấp bởi thư viện đã cho: http://api.jquery.com/jQuery.each/ Một chủ đề nhỏ, nhưng hơi quan trọng ... – Igor

3
function getKeys(obj){ 
    var keys = []; 
    for (key in obj) { 
     if (obj.hasOwnProperty(key)) { keys[keys.length] = key; } 
    } 
    return keys; 
} 
+0

+1 để kiểm tra thích hợp với hasOwnProperty (mặc dù tôi thích gọi nó là Object.prototype) – JAAulde

1

Dưới đây là triển khai từ phpjs.org:

Đây là không mã của tôi, tôi chỉ trỏ bạn đến một tài nguyên hữu ích.

+1

Các hàm bạn đang hiển thị dường như trả về băm thay vì mảng hoặc là { 0: "test"} một từ đồng nghĩa cho ["test"]? – greg0ire

0

Đây là một ví dụ tốt về array_keys từ PHP.js library:

function array_keys (input, search_value, argStrict) { 
    // Return just the keys from the input array, optionally only for the specified search_value 

    var search = typeof search_value !== 'undefined', 
     tmp_arr = [], 
     strict = !!argStrict, 
     include = true, 
     key = ''; 

    for (key in input) { 
     if (input.hasOwnProperty(key)) { 
      include = true; 
      if (search) { 
       if (strict && input[key] !== search_value) { 
        include = false; 
       } 
       else if (input[key] != search_value) { 
        include = false; 
       } 
      } 

      if (include) { 
       tmp_arr[tmp_arr.length] = key; 
      } 
     } 
    } 

    return tmp_arr; 
} 

Cũng vậy với array_values (from the same PHP.js library):

function array_values (input) { 
    // Return just the values from the input array 

    var tmp_arr = [], 
     key = ''; 

    for (key in input) { 
     tmp_arr[tmp_arr.length] = input[key]; 
    } 

    return tmp_arr; 
} 

EDIT: Removed khoản không cần thiết từ mã.

+0

Các chức năng mà bạn đang hiển thị có vẻ trả lại băm thay vì mảng hoặc là {0: "test"} một từ đồng nghĩa cho ["test"]? – greg0ire

+0

@ greg0ire Chúng không đồng nghĩa với nhau. '{0:" test "}' là một thể hiện của 'Object', trong khi' ["test"] 'là một instance của' Array'. Nhưng cả hai đều có thành viên '0' của giá trị' "test" '. – Imp

+0

Có các đối tượng và mảng trong JavaScript. Hash bạn đang nói về là một đối tượng. Nếu bạn có một cái nhìn tại dòng với 'var tmp_arr = []', nó cho thấy biến 'tmp_arr' là một mảng (' [] ') nhưng không phải là một đối tượng (' {} '). Vì vậy, cả hai phương thức trả về mảng. – VisioN

0
var myHash = {"apples": 3, "oranges": 4, "bananas": 42} 
vals=(function(e){a=[];for (var i in e) a.push(e[i]); return a;})(myHash).join(',') 
keys=(function(e){a=[];for (var i in e) a.push( i); return a;})(myHash).join(',') 
console.log(vals,keys) 

cơ bản

array=(function(e){a=[];for (var i in e) a.push(e[i]); return a;})(HASHHERE) 
13

Câu trả lời thứ hai (tại thời điểm viết bài) cho:

var values = keys.map(function(v) { return myHash[v]; }); 

Nhưng tôi thích sử dụng của jQuery riêng $.map:

var values = $.map(myHash, function(v) { return v; }); 

Kể từ jQuery chăm sóc c khả năng tương thích với trình duyệt ross. Cộng với nó ngắn hơn :)

Ở mức độ nào, tôi luôn cố gắng hoạt động hết mức có thể. Một lớp lót là tốt hơn so với vòng lặp.

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