2010-12-13 4 views

ответ

119

Массивы должны иметь только записи с числовыми ключами (массивы и объекты, но вы действительно не должны смешивать эти).

Если вы преобразуете массив в JSON, процесс будет учитывать только числовые свойства. Другие свойства просто игнорируются, поэтому вы получаете пустой массив. Может быть, это более очевидно, если вы посмотрите на length массива:

> AssocArray.length 
0 

То, что часто называют «ассоциативный массив» на самом деле просто объект в 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"}" 

Свойства объектов может доступ к ним через нотацию или дескриптор массива (если ключ не является зарезервированным ключевым словом). Таким образом, AssocArray.a совпадает с AssocArray['a'].

+3

Неверно; массивы также являются объектами. 'Json.stringify' игнорирует свойства массива без массивов. – SLaks

+8

@SLaks: я никогда не говорил, что массивы не являются объектами;) Я просто говорю, что нельзя использовать массив как ассоциативный массив (возможно, возможно, что он может * потому что * они * являются * объектами, но я думаю, что это становится действительно уродливым и путают и, в конце концов, вы ответственны за крах Вселенной ...). –

+8

Чтобы уточнить ответ: когда вы инициализируете его, используйте '{}' или 'new Object()', ** NOT ** '[]' или 'new Array()' – Thymine

7

В JavaScript нет ассоциативных массивов. Тем не менее, есть объекты с именованными свойствами, поэтому просто не инициализируйте свой «массив» с помощью new Array, тогда он станет универсальным объектом.

+0

Спасибо за это, просто и эффективно! – Astravagrant

-1

Вы можете нажать на объект в массив

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

Какая часть этого определяет ассоциативный массив? – GreensterRox

0

Я разместил исправление этой here

Вы можете использовать эту функцию, чтобы изменить JSON.stringify для кодирования arrays, просто опубликовать его ближе к началу (см. ссылку выше для более подробной информации):

// 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

Согласен, что это, вероятно, лучший пр. actice для хранения объектов как объектов и массивов в виде массивов. Однако, если у вас есть объект с именованными свойствами, которые вы рассматриваете как массив, вот как это можно сделать:

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

let json = JSON.stringify(tempArr); 
Смежные вопросы