web-dev-qa-db-ja.com

JavaScriptでJSONオブジェクトを並べ替える

たとえば、次のコードがあります:

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

このjsonをこのようにソートするにはどうすればよいですか-

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

ユーザーをIDでソートしました。
javascriptでこれを行う方法がわかりません。

30
julian

まず、それはnot JSONです。 JavaScriptオブジェクトリテラルです。 JSONはデータの文字列表現であり、JavaScript構文に非常によく似ています。

次に、オブジェクトがあります。それらは分類されていません。要素の順序は保証できません。順序を保証したい場合は、配列を使用する必要があります。これには、データ構造を変更する必要があります。

1つのオプションは、データを次のようにすることです。

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

これでオブジェクトの配列ができましたので、並べ替えることができます。

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

結果の配列は次のようになります。

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

以下は、JsonのJavaScript表現をソートする簡単なスニペットです。

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

次のように使用できます。

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

それは出力されます:

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

いくつかの点で、あなたの質問は非常に正当なように見えますが、それでもXY problemとラベル付けするかもしれません。最終結果は、ソートされた値を何らかの方法で表示したいということだと思いますか? Bergiがコメントで述べたように、Javascriptオブジェクト({i_am: "an_object"})に特定の順序でプロパティを表示することは決してできませんrely

表示順序については、オブジェクトの各キー(つまり、i_am)を取得し、順序付けられた配列に並べ替えることをお勧めします。次に、表示するオブジェクトの要素を取得するときにその配列を使用します。擬似コード:

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