2011-10-05 86 views
5

Tôi đang sử dụng một đối tượng làm bảng băm. Tôi muốn nhanh chóng in ra nội dung của nó (ví dụ: alert()). Có bất kỳ thứ gì được tích hợp để chuyển đổi băm thành các mảng (khóa, giá trị) không?Làm phẳng đối tượng thành mảng?

+0

có vấn đề gì với 'console.log' hoặc' console.dir'? – jAndy

+0

Có gì sai với bảng điều khiển.log()? Tại sao lại cảnh giác? Nó không bao giờ hiển thị đủ thông tin gỡ lỗi. Bàn điều khiển của các trình duyệt mới hơn sẽ hiển thị thông tin đầy đủ nếu bạn console.log biến của bạn. Ngoài ra, các mảng JS là các đối tượng .. hoặc nếu bạn muốn, các đối tượng là các mảng kết hợp. –

+0

@ N.B .: JS 'Array' là 'Object'; và JS 'Object' s mô hình khái niệm về "mảng kết hợp", nhưng "mảng kết hợp" và 'Array' là khái niệm riêng biệt. Đừng nhầm lẫn chúng! Thuật ngữ của OP là tại chỗ. –

Trả lời

2

tôi cập nhật này một số chi tiết. Việc phân tích cú pháp này dễ dàng hơn nhiều so với console.log vì nó bỏ qua các nội dung bổ sung có trong đó như __proto__.

function flatten(obj) { 
    var empty = true; 
    if (obj instanceof Array) { 
     str = '['; 
     empty = true; 
     for (var i=0;i<obj.length;i++) { 
      empty = false; 
      str += flatten(obj[i])+', '; 
     } 
     return (empty?str:str.slice(0,-2))+']'; 
    } else if (obj instanceof Object) { 
     str = '{'; 
     empty = true; 
     for (i in obj) { 
      empty = false; 
      str += i+'->'+flatten(obj[i])+', '; 
     } 
     return (empty?str:str.slice(0,-2))+'}'; 
    } else { 
     return obj; // not an obj, don't stringify me 
    } 
} 

Điều duy nhất tôi sẽ làm để cải thiện điều này là nó đã thụt lề chính xác dựa trên mức đệ quy.

+0

Tại sao bạn chọn điều này trên 'console.log'? Tại sao bạn tránh các tùy chọn gỡ lỗi tuyệt vời mà trình duyệt của bạn cung cấp cho bạn? –

+2

Ai nói ai đó đã tránh được 'console.log'? Câu hỏi đặt ra là làm thế nào để làm phẳng dữ liệu. 'alert()' chỉ được đề cập "ví dụ". Điều gì sẽ xảy ra nếu anh ta muốn gửi nó trở lại máy chủ thông qua Ajax để được đăng nhập ở đó? –

+0

Tôi biết về 'console.log' và nó chắc chắn là tuyệt vời cho hầu hết các nhu cầu gỡ lỗi của tôi. Tuy nhiên đôi khi tôi thấy hữu ích khi sử dụng cảnh báo để tìm hiểu chính xác khi có điều gì đó xảy ra. Mã trực tiếp sau khi cảnh báo không được thực hiện cho đến khi bạn OK cảnh báo. Nói chung khi hành vi này không được mong muốn, có rất ít lý do để sử dụng 'alert()'. –

0

Sử dụng vòng lặp for:

for (var x in yourObj) 
{ 
    alert(yourObj[x]); 
} 
+0

theo cách đó bạn sẽ chỉ thấy các giá trị. Bute thậm chí nếu bạn tập trung các phím quá, nó sẽ cảnh báo nhiều lần có lẽ. Bạn nên tạo một chuỗi và cảnh báo kết quả cuối cùng. – jAndy

+0

cũng đây chỉ là một ví dụ về vòng lặp for, chứ không phải là việc thực hiện đầy đủ những gì mà op muốn. anh ta có thể tìm ra phần còn lại. – m0sa

1

Không phải là tôi biết. Tuy nhiên, bạn có thể tự mình làm khá ngắn gọn:

var obj = { a: 1, b: 2, c: 3 }; 
var arr = []; 
for (var i in obj) { 
    var e = {}; 
    e[i] = obj[i]; 
    arr.push(e); 
} 
console.log(arr); 
// Output: [Object { a=1 }, Object { b=2 }, Object { c=3 }] 

Tất nhiên, bạn không thể alert này một trong hai, vì vậy bạn cũng có thể chỉ console.log(obj) ở nơi đầu tiên.


Bạn thể mảng đầu ra của mảng:

var obj = { a: 1, b: 2, c: 3 }; 
var arr = []; 
for (var i in obj) { 
    arr.push([i, obj[i]]); 
} 
console.log(arr); 
// Output: [["a", 1], ["b", 2], ["c", 3]] 

alert(arr); 
// Alert: a, 1, b, 2, c, 3 

Nhưng, một lần nữa, ew.

6

Vì bạn muốn alert, tôi cho rằng nó không dành cho phiên bản sản xuất của bạn và khả năng tương thích trình duyệt cũ không phải là vấn đề.

Nếu đây là trường hợp, sau đó bạn có thể làm điều này:

var myHash = ...... 
alert(Object.keys(myHash).map(function(key) { return [key, myHash[key]]; })); 
+0

Điều này khá ngọt ngào. –

+0

Ồ, đúng là: 'var myUsers = {}; ' ' myUsers [0] = {' id ':' x ',' tên người dùng ':' aaa '} \ n' 'myUsers [1 ] = {'id': 'y', 'tên người dùng': 'bbb'} ' ' Object.keys (myUsers) .map (hàm (khóa) {return myUsers [key] .username;}) ' Cảm ơn ! – dirkk0

1

cho nhanh & sử dụng bẩn trong alert bạn có thể sử dụng JSON:

alert(JSON.stringify(yourObj).replace(/,/g,'\n')); 
1

Đây là phiên bản của tôi về nó. Nó sẽ cho phép bạn để làm phẳng đầu vào như dưới đây:

var input = { 
    a: 'asdf', 
    b: [1,2,3], 
    c: [[1,2],[3,4]], 
    d: {subA: [1,2]} 
} 

Chức năng là như thế này:

function flatten (input, output) { 

     if (isArray(input)) { 
     for(var index = 0, length = input.length; index < length; index++){ 
      flatten(input[index], output); 
     } 
     } 
     else if (isObject(input)) { 
     for(var item in input){ 
      if(input.hasOwnProperty(item)){ 
      flatten(input[item], output); 
      } 
     } 
     } 
     else { 
     return output.push(input); 
     } 
    }; 

    function isArray(obj) { 
     return Array.isArray(obj) || obj.toString() === '[object Array]'; 
    } 

    function isObject(obj) { 
     return obj === Object(obj); 
    } 

Cách sử dụng cái gì đó như:

var output = []

flatten (đầu ra đầu vào);

Sau đó, đầu ra phải là mảng được làm phẳng.

0

Có thể hơi muộn, nhưng ở đây bạn có phiên bản câu trả lời của tôi, được cập nhật lên ES2015. Tôi sử dụng chức năng đệ quy và nó hoạt động ngay cả khi có các đối tượng khác bên trong đối tượng chính:

function objectFlattener (object) { 
    return Reflect.apply(Array.prototype.concat, [], Object.keys(object).map(key => { 
    if (object[key] instanceof Object) { 
     return objectFlattener(object[key]); 
    } 
    return `${ key }: ${ object[key] }`; 
    })); 
} 

Vì vậy, thay đổi lần cuối bạn có thể định dạng phần tử bên trong mảng.

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