2010-12-13 41 views
63

Làm cách nào để chuyển đổi một mảng kết hợp JavaScript thành JSON?Mảng kết hợp JavaScript thành JSON

Tôi đã thử những điều sau đây:

var AssocArray = new Array(); 

AssocArray["a"] = "The letter A" 

console.log("a = " + AssocArray["a"]); 

// result: "a = The letter A" 

JSON.stringify(AssocArray); 

// result: "[]" 

Trả lời

119

Mảng chỉ nên có mục với các phím số (mảng cũng là đối tượng mà bạn thực sự không nên nhầm lẫn giữa chúng).

Nếu bạn chuyển đổi một mảng thành JSON, quá trình này sẽ chỉ tính đến các thuộc tính số. Các thuộc tính khác chỉ đơn giản là bị bỏ qua và đó là lý do tại sao bạn nhận được một mảng trống như là kết quả. Có lẽ điều này rõ ràng hơn nếu bạn nhìn vào length của mảng:

> AssocArray.length 
0 

gì thường được gọi là "mảng kết" thực sự chỉ là một đối tượng trong JS:

var AssocArray = {}; // <- initialize an object, not an array 
AssocArray["a"] = "The letter A" 

console.log("a = " + AssocArray["a"]); // "a = The letter A" 
JSON.stringify(AssocArray); // "{"a":"The letter A"}" 

Thuộc tính của các đối tượng có thể được truy cập thông qua ký hiệu mảng hoặc ký hiệu chấm (nếu khóa không phải là từ khóa dành riêng). Do đó, AssocArray.a cũng giống như AssocArray['a'].

+3

Không chính xác; mảng cũng là các đối tượng. 'Json.stringify' bỏ qua các thuộc tính không mảng của mảng. – SLaks

+8

@SLaks: Tôi không bao giờ nói rằng mảng không phải là đối tượng;) Tôi chỉ nói rằng người ta không thể sử dụng mảng như mảng kết hợp (ok có lẽ một người có thể * vì * họ * là * đối tượng, nhưng tôi nghĩ điều này thực sự xấu và gây nhầm lẫn và cuối cùng bạn chịu trách nhiệm cho sự sụp đổ của vũ trụ ...). –

+8

Chỉ cần làm rõ câu trả lời: khi bạn initalize nó sử dụng '{}' hoặc 'new Object()', ** NOT ** '[]' hoặc 'new Array()' – Thymine

7

Không có mảng liên kết trong JavaScript. Tuy nhiên, có các đối tượng có thuộc tính được đặt tên, do đó, chỉ cần không khởi tạo "mảng" của bạn với new Array, sau đó nó trở thành một đối tượng chung chung.

+0

Cảm ơn điều này, đơn giản và hiệu quả! – Astravagrant

-1

Bạn có thể muốn đẩy đối tượng vào mảng

enter code here 

var AssocArray = new Array(); 

AssocArray.push("The letter A"); 

console.log("a = " + AssocArray[0]); 

// result: "a = The letter A" 

console.log(AssocArray[0]); 

JSON.stringify(AssocArray); 
+0

Phần nào trong số này xác định một mảng kết hợp? – GreensterRox

0

tôi đã đăng một sửa chữa cho điều này here

Bạn có thể sử dụng chức năng này để sửa đổi JSON.stringify để mã hóa arrays, chỉ cần dán nó gần đầu các kịch bản của bạn (đánh dấu vào đường link trên để xem chi tiết hơn):

// Upgrade for JSON.stringify, updated to allow arrays 
(function(){ 
    // Convert array to object 
    var convArrToObj = function(array){ 
     var thisEleObj = new Object(); 
     if(typeof array == "object"){ 
      for(var i in array){ 
       var thisEle = convArrToObj(array[i]); 
       thisEleObj[i] = thisEle; 
      } 
     }else { 
      thisEleObj = array; 
     } 
     return thisEleObj; 
    }; 
    var oldJSONStringify = JSON.stringify; 
    JSON.stringify = function(input){ 
     if(oldJSONStringify(input) == '[]') 
      return oldJSONStringify(convArrToObj(input)); 
     else 
      return oldJSONStringify(input); 
    }; 
})(); 
2

Đồng ý rằng nó có lẽ là pr tốt nhất actice để giữ các đối tượng như các đối tượng và mảng như mảng. Tuy nhiên, nếu bạn có một đối tượng có thuộc tính được đặt tên mà bạn đang xử lý dưới dạng mảng, dưới đây là cách thực hiện:

let tempArr = []; 
Object.keys(objectArr).forEach((element) => { 
    tempArr.push(objectArr[element]); 
}); 

let json = JSON.stringify(tempArr); 
Các vấn đề liên quan