Асоціативний масив JavaScript до JSON


78

Як я можу перетворити асоціативний масив JavaScript у JSON?

Я спробував наступне:

var AssocArray = new Array();

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

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

// result: "a = The letter A"

JSON.stringify(AssocArray);

// result: "[]"

Відповіді:


143

Масиви повинні мати записи лише з цифровими клавішами (масиви - це також об’єкти, але ви насправді не повинні їх змішувати).

Якщо перетворити масив у 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ігнорує властивості масивів, що не є масивами.
Слакс

9
@SLaks: Я ніколи не говорив, що масиви не є об'єктами;) Я просто кажу, що не можна використовувати масив як асоціативний масив (ок, мабуть, можна було б, тому що це об'єкти, але я думаю, що це стає потворним і заплутаним, і врешті-решт ти відповідальний за розпад Всесвіту ...).
Фелікс Клінг,

13
Тільки для пояснення відповіді: коли ви ініціалізуєте його, використовуйте {}або new Object(), НЕ [] абоnew Array()
Тимін

1
Коментар @ Thymine НАЙЦІНІШИЙ! ЗВЕРНІТЬ УВАГУ, ЯК ви ініціалізуєте дані у javascript. Використовуйте {} (!!!)
Євген Капустін

8

У JavaScript відсутні асоціативні масиви. Однак є об'єкти з іменованими властивостями, тому просто не ініціалізуйте свій "масив" new Array, тоді він стане загальним об'єктом.


Дякую за це, просто та ефективно!
Астравагрант,

4

Погодився з тим, що, мабуть, найкраща практика зберігати Об’єкти як об’єкти, а Масиви як масиви. Однак якщо у вас є об’єкт з іменованими властивостями, який ви обробляєте як масив, ось як це можна зробити:

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

let json = JSON.stringify(tempArr);

2

Я розмістив виправлення цього тут

Ви можете використовувати цю функцію для модифікації 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);
    };
})();

-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);

Яка частина цього визначає асоціативний масив?
GreensterRox
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.