Convertir un objet ou un tableau javascript en json pour les données ajax

donc je crée un tableau avec des informations d'éléments. Je boucle sur tous les éléments et enregistrer l'index. Pour une raison quelconque, Je ne peux pas convertir ce tableau en objet json!

C'est ma boucle de tableau:

var display = Array();
$('.thread_child').each(function(index, value){
   display[index]="none";
   if($(this).is(":visible")){
      display[index]="block";
   }
});

j'ai essayer de le transformer en un objet JSON:

data = JSON.stringify(display);

il ne semble pas envoyer le format JSON approprié!

Si j'ai la main de code comme ceci, ça fonctionne et envoie des informations:

data = {"0":"none","1":"block","2":"none","3":"block","4":"block","5":"block","6":"block","7":"block","8":"block","9":"block","10":"block","11":"block","12":"block","13":"block","14":"block","15":"block","16":"block","17":"block","18":"block","19":"block"};

quand je fais une alerte sur le JSON.stringify objet il ressemble à la main codée un. Mais ça ne fonctionne pas.

je deviens folle en essayant de résoudre ça! Ce qui me manque ici? Quelle est la meilleure façon d'envoyer cette information pour obtenir le format codé main?

j'utilise cette méthode ajax pour envoyer des données:

$.ajax({
        dataType: "json",
        data:data,
        url: "myfile.php",
        cache: false,
        method: 'GET',
        success: function(rsp) {
            alert(JSON.stringify(rsp));
        var Content = rsp;
        var Template = render('tsk_lst');
        var HTML = Template({ Content : Content });
        $( "#task_lists" ).html( HTML );
        }
    });

utiliser la méthode GET parce que j'affiche des informations (Pas de mise à jour ou d'insertion). J'envoie seulement des informations d'affichage à mon fichier php.


FIN SOLUTION


var display = {};
$('.thread_child').each(function(index, value){
   display[index]="none";
   if($(this).is(":visible")){
      display[index]="block";
   }
});

$.ajax({
        dataType: "json",
        data: display,
        url: "myfile.php",
        cache: false,
        method: 'GET',
        success: function(rsp) {
            alert(JSON.stringify(rsp));
        var Content = rsp;
        var Template = render('tsk_lst');
        var HTML = Template({ Content : Content });
        $( "#task_lists" ).html( HTML );
        }
    });
32
demandé sur Brian Tompsett - 汤莱恩 2013-11-14 09:35:43

2 réponses

Je ne suis pas tout à fait sûr mais je pense que vous êtes probablement surpris de la façon dont les tableaux sont sérialisés dans JSON. Nous allons isoler le problème. Considérez le code suivant:

var display = Array();
display[0] = "none";
display[1] = "block";
display[2] = "none";

console.log( JSON.stringify(display) );

imprimer:

["none","block","none"]

Voici comment JSON sérialise réellement le tableau. Cependant ce que vous voulez voir est quelque chose comme:

{"0":"none","1":"block","2":"none"}

pour obtenir ce format vous voulez sérialiser l'objet, pas le tableau. Alors réécrivons le code ci-dessus comme ceci:

var display2 = {};
display2["0"] = "none";
display2["1"] = "block";
display2["2"] = "none";

console.log( JSON.stringify(display2) );

imprimer dans la le format que vous souhaitez.

Vous pouvez jouer avec ce ici: http://jsbin.com/oDuhINAG/1/edit?js console

70
répondu ShitalShah 2013-11-14 05:49:00

Vous pouvez utiliser JSON.stringify(object) avec un objet et je viens d'écrire une fonction qui convertira récursivement un tableau en un objet, comme ceci JSON.stringify(convArrToObj(array)), qui est le code suivant (plus de détails peuvent être trouvés sur cette réponse):

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

Pour le rendre plus générique, vous pouvez remplacer le JSON.stringify fonction et vous n'aurez pas à vous soucier de nouveau, pour ce faire, il suffit de coller ce à le haut de votre page:

// Modify JSON.stringify to allow recursive and single-level 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){
        return oldJSONStringify(convArrToObj(input));
    };
})();

Et JSON.stringify accepter arrays ou objects! (lien vers le jsFiddle avec exemple)


Edit:

Voici une autre version qui est un peu plus efficace, bien qu'elle puisse ou non être moins fiable (pas sûr -- cela dépend de si JSON.stringify(array)toujours retourne [], ce qui je ne vois pas beaucoup de raison pour que cela ne fonctionne pas, donc cette fonction devrait être meilleure car elle fait un peu moins de travail quand vous utilisez JSON.stringify avec un object):

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

jsFiddle avec exemple ici

js test de Performance here, via jsPerf

17
répondu JVE999 2017-05-23 12:17:53