web-dev-qa-db-fra.com

trier l'objet json en javascript

Par exemple avec avoir ce code:

var json = {
    "user1" : {
        "id" : 3
    },
    "user2" : {
        "id" : 6
    },
    "user3" : {
        "id" : 1
    }
}

Comment puis-je trier ce json pour être comme ça -

var json = {
    "user3" : {
        "id" : 1
    },
    "user1" : {
        "id" : 3
    },
    "user2" : {
        "id" : 6
    }
}

J'ai trié les utilisateurs avec les ID ..
Je ne sais pas comment faire cela en javascript ..

30
julian

Tout d'abord, c'est pas JSON. C'est un littéral d'objet JavaScript. JSON est une représentation sous forme de chaîne de données, qui ressemble à la syntaxe JavaScript.

Deuxièmement, vous avez un objet. Ils ne sont pas triés. L'ordre des éléments ne peut être garanti. Si vous voulez un ordre garanti, vous avez besoin d'utiliser un tableau. Cela vous obligera à modifier votre structure de données.

Une option pourrait être de faire ressembler vos données à ceci:

var json = [{
    "name": "user1",
    "id": 3
}, {
    "name": "user2",
    "id": 6
}, {
    "name": "user3",
    "id": 1
}];

Vous avez maintenant un tableau d'objets et nous pouvons le trier.

json.sort(function(a, b){
    return a.id - b.id;
});

Le tableau résultant ressemblera à:

[{
    "name": "user3",
    "id" : 1
}, {
    "name": "user1",
    "id" : 3
}, {
    "name": "user2",
    "id" : 6
}];
75
Rocket Hazmat

Voici un simple extrait qui trie une représentation javascript d'un Json.

function isObject(v) {
    return '[object Object]' === Object.prototype.toString.call(v);
};

JSON.sort = function(o) {
if (Array.isArray(o)) {
        return o.sort().map(JSON.sort);
    } else if (isObject(o)) {
        return Object
            .keys(o)
        .sort()
            .reduce(function(a, k) {
                a[k] = JSON.sort(o[k]);

                return a;
            }, {});
    }

    return o;
}

Il peut être utilisé comme suit:

JSON.sort({
    c: {
        c3: null,
        c1: undefined,
        c2: [3, 2, 1, 0],
    },
    a: 0,
    b: 'Fun'
});

Cela produira:

{
  a: 0,
  b: 'Fun',
  c: {
    c2: [3, 2, 1, 0],
    c3: null
  }
}
4
Vyacheslav Cotruta

À certains égards, votre question semble très légitime, mais je pourrais quand même la qualifier de XY problem. Je suppose que le résultat final est que vous voulez afficher les valeurs triées d'une manière ou d'une autre? Comme Bergi l'a dit dans les commentaires, vous ne pouvez jamais tout à fait compter sur des objets Javascript ({i_am: "an_object"}) pour afficher leurs propriétés dans un ordre particulier.

Pour l'ordre d'affichage, je vous suggère de prendre chaque touche de l'objet (c'est-à-dire i_am) et les trier dans un tableau ordonné. Ensuite, utilisez ce tableau lors de la récupération des éléments de votre objet à afficher. Pseudocode:

var keys = [...]
var sortedKeys = [...]
for (var i = 0; i < sortedKeys.length; i++) {
  var key = sortedKeys[i];
  addObjectToTable(json[key]);
}
1
Katana314