在JavaScript中对JSON对象进行排序

58

例如,我们有以下代码:

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中实现这一点。


3
与此问题 Sorting JavaScript Object by property value 完全相同。请注意,您无法对它们进行排序;对象是无序的键值映射。 - Bergi
这并没有帮助我,因为我的JSON格式不同,那里的答案在我的JSON上出了一些问题。 - julian
3
当然你需要去适应它... 你明白它是如何工作的吗?如果是的话,但你在适应它方面遇到了问题,请发布你的尝试。 - Bergi
将JSON转换为数组,对数组进行排序,然后再转换回JSON。这应该可以实现,但如果您不想使用JSON来完成此操作,也许可以考虑其他方法。 - SharkofMirkwood
3
@SharkofMirkwood说没有涉及到JSON,而是普通的对象字面量。如果将其转换回对象,排序将无效,因此这样做没有意义。 - Bergi
4个回答

144

首先,那不是 JSON,而是 JavaScript 对象字面量。JSON 是数据的一种字符串表示形式,它非常类似于 JavaScript 语法。

其次,你有一个对象。 它们是未排序的。 元素的顺序无法保证。 如果您想要有保证的顺序,您需要使用数组。 这将需要您更改数据结构。

其中一种选择可能是让您的数据看起来像这样:

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

17
很好的答案,要倒序排列可以这样写:return b.id - a.id; - w3spi

14

以下是一个简单的代码片段,它可以对 JavaScript 表示的 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;
}

它可以按如下方式使用:

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

1
虽然这很有趣,但它并没有直接回答所提出的问题。 - Spencer Sullivan
1
我认为这需要一些解释才能回答。你可以根据这个自由排序,不必提供一个数组。有趣的部分是 Object.keys( ... ).sort( ... )。 - Solostaran14
这个特定问题的答案应该是:const sortedJson = Object.keys(json).sort( (a,b) => json[a].id - json[b].id ).reduce( (accu, val, index, array) => { accu[\`${val}\`] = json[val]; return accu; }, {}); - Solostaran14

1
在某些方面,你的问题看起来非常合理,但我仍然可能将其标记为“XY问题”。我猜你最终想要以某种方式显示排序后的值?正如Bergi在评论中所说,你永远无法完全依赖Javascript对象({i_am:“an_object”})按任何特定顺序显示它们的属性。
对于显示顺序,我建议你取对象的每个键(即i_am)并将它们排序为一个有序数组。然后,使用该数组在检索对象元素以显示时。伪代码:
var keys = [...]
var sortedKeys = [...]
for (var i = 0; i < sortedKeys.length; i++) {
  var key = sortedKeys[i];
  addObjectToTable(json[key]);
}

-5
if(JSON.stringify(Object.keys(pcOrGroup).sort()) === JSON.stringify(Object.keys(orGroup)).sort())
{
    return true;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接