I have some JSON data that I get from a server. In my JavaScript, I want to do some sorting on it. I think the sort() function will do what I want.

但是,JavaScript似乎是在JSON数据到达时立即将其转换为对象.如果我try 使用ort()方法,我会收到大量错误(使用Firebug进行测试).

I've looked around the net, and everyone seems to say that for one thing, JSON objects are already JavaScript arrays, and also that Objects can be treated just like arrays. Like over on this question, where in one of the answers, a guy says "The [Object object] is your data -- you can access it as you would an array."

然而,事实并非如此.JavaScript不允许我在对象上使用sort().由于默认的假设是它们都是一样的,所以似乎没有任何关于如何将对象转换为数组,或强制JavaScript将其视为一个数组,或诸如此类的指令.

So... how do I get JavaScript to let me treat this data as an array and sort() it?

Console log output of my object looks like this (I want to be able to sort by the values in the "level"):

OBJECT JSONdata

{ 
1: {
    displayName: "Dude1",
    email: "dude1@example.com<mailto:dude1@example.com>",
    lastActive: 1296980700, 
    level: 57, 
    timeout: 12969932837
}, 2: {
    displayName: "Dude2",
    email: "dude2@example.com<mailto:dude2@example.com>",
    lastActive: 1296983456,
    level: 28,
    timeout: 12969937382
}, 3: {
    displayName: "Dude3",
    email: "dude3@example.com<mailto:dude3@example.com>",
    lastActive: 1296980749,
    level: 99,
    timeout: 129699323459
} 
}

推荐答案

Array.prototype.slice.call(arrayLikeObject)

是将类数组对象转换为数组的标准方法.

这只适用于arguments物体.将通用对象转换为数组有点麻烦.以下是underscore.js的来源:

_.toArray = function(iterable) {
    if (!iterable)                return [];
    if (iterable.toArray)         return iterable.toArray();
    if (_.isArray(iterable))      return iterable;
    if (_.isArguments(iterable))  return slice.call(iterable);
    return _.values(iterable);
};

_.values = function(obj) {
    return _.map(obj, _.identity);
};

原来您需要循环遍历您的对象,并将其映射到一个array.

var newArray = []
for (var key in object) {
    newArray.push(key);
}

你混淆了数组和"关联数组"的概念.在JavaScript中,对象的行为有点像一个关联数组,因为您可以访问object["key"]格式的数据.它们不是真正的关联数组,因为对象是无序列表.

对象和数组有很大的不同.

以下是使用下划线的示例:

var sortedObject = _.sortBy(object, function(val, key, object) {
    // return an number to index it by. then it is sorted from smallest to largest number
    return val;
});

live example

Json相关问答推荐

Jolt转换问题—使用键查找匹配对象

从json数组中删除特定元素

使用不同行数的数据创建嵌套Jolt

取消嵌套数组并将数组名称添加为附加字段

如何在 JSonPath 中按值查找列表中的所有元素

嵌套存储在字符串变量中的 JSON 对象

如何在jolt中使用shift和modify-overwrite-beta

为什么解析的字典相等而腌制的字典不相等?

我无法在 Go - Gin 中解析日期/时间

向 JSON 文件添加注释

boost::json::value 的大括号初始化将其从对象转换为数组

hook到 Decodable.init() 以获得未指定的键?

Jackson 的@JsonView、@JsonFilter 和 Spring

Jackson 没有使用 @JsonProperty 覆盖 Getter

如何将 Swift 对象转换为字典

如何在 Rails 模型中验证字符串是否为 json

如何使用 SwiftyJSON 遍历 JSON?

将 Pandas 数据框转换为嵌套 JSON

如何在 postgresql 9.3 中循环 JSON 数组

用 JSON 编写 HTML 字符串