Сортировка объекта Javascript по значению - PullRequest
4 голосов
/ 14 сентября 2011

В моем приложении Javascript у меня есть объект, и мне нужно иметь возможность упорядочить массив по значению во внутреннем объекте.

Например:

{
    a : {
        timestamp: xxxxxx
        other : yyyyyy
    },
    b : {
        timestamp: xxxxxx
        other : yyyyyy
    },
    c : {
        timestamp: xxxxxx
        other : yyyyyy
    }
}

Что мне нужносделать, это управлять этим набором данных и переупорядочить массив в соответствии с меткой времени каждого внутреннего объекта.

Как они могут это сделать?

update:

Моей первоначальной мыслью было бы сделать что-то вроде этого:

{
    a : {},
    b : {},
    c : {},
    _ : [
        c, a, b //Key's Only
    ]
}

Затем переиндексировать объект на основе этих значений, что бы разобраться, как индексировать объект, но когда я вставляюновый элемент, который я также должен был бы восстановить _ индексное отношение, которое, кажется, требует больших усилий.

Ответы [ 5 ]

6 голосов
/ 14 сентября 2011

Вы можете скопировать данные в массив и затем отсортировать их:

var data = {
    a : {
        timestamp: 11111,
        other : "xxx"
    },
    b : {
        timestamp: 22222,
        other : "yyy"
    },
    c : {
        timestamp: 33333,
        other : "zzz"
    }
};

var output = [];

// copy items to an array so they can be sorted
for (var key in data) {
    data[key].key = key;   // save key so you can access it from the array (will modify original data)
    output.push(data[key]);
}    

output.sort(function(a,b) {
    return(a.timestamp - b.timestamp);
});

Создает это как вывод (заметьте, я добавил оригинальный ключ к объекту, чтобы он был доступен из массива):

[{"timestamp":11111,"other":"xxx","key":"a"},
{"timestamp":22222,"other":"yyy","key":"b"},
{"timestamp":33333,"other":"zzz","key":"c"}]

Вы можете увидеть это здесь: http://jsfiddle.net/jfriend00/hXpkP/

2 голосов
/ 14 сентября 2011

Вы имеете дело не с массивом, а с объектом со значениями свойств a, b и c

. Нет причин, по которым они могут понадобиться в определенном порядке, так каквы не можете зациклить их в любом конкретном порядке.

это было бы тривиально (используя sort), если бы вы были работа с массивом ...

var array = [
    {
        timestamp: xxxxxx
        other : yyyyyy
    },
    {
        timestamp: xxxxxx
        other : yyyyyy
    },
    {
        timestamp: xxxxxx
        other : yyyyyy
    }
];

array.sort(function(a,b) {
    return a.timestamp - b.timestamp;
});
2 голосов
/ 14 сентября 2011

Как уже говорили другие, вы имеете дело с ассоциативным объектом.Не массив.У объектов нет порядка.

Если вы хотите оставить все как есть и вместо этого отсортировать массив ключей, вы можете сделать это:

var obj = {
    a : {
        timestamp: xxxxxx
        other : yyyyyy
    },
    b : {
        timestamp: xxxxxx
        other : yyyyyy
    },
    c : {
        timestamp: xxxxxx
        other : yyyyyy
    }
};

var keys = [];
for(var key in obj) {
    keys.push(key);
}

keys.sort(function(a, b) {
    return obj[a].timestamp - obj[b].timestamp;
});

Теперь вы можете получить доступобъект через значения массива (например, obj [keys [0]], obj [keys [1]] и т. д.).Это предполагает, что временные метки являются числовыми.Если они являются объектами даты, сортировка должна быть такой:

keys.sort(function(a, b) {
    return +obj[a].timestamp - (+obj[b].timestamp);
});

Если метки времени на самом деле являются строками, представляющими время даты (например, «2 августа 2012 года»), то это должно быть:

keys.sort(function(a, b) {
    return +new Date(obj[a].timestamp) - (+new Date(obj[b].timestamp));
});

Так что используйте все, что имеет больше смысла в вашем сценарии.

2 голосов
/ 14 сентября 2011

Объекты Javascript являются , а не ассоциативными массивами. Они могут вести себя одинаково, но они не одинаковы. Javascript не имеет ассоциативных массивов.

Хотя ассоциативные массивы имеют концепцию порядка, объекты Javascript просто не разделяют с ними эту особенность. Объекты, по самой своей природе, не упорядочены.

Итак, чтобы ответить на ваш вопрос: вы не можете их заказать ...

0 голосов
/ 14 сентября 2011

Вы можете создать пользовательскую функцию сравнения и использовать встроенную функцию сортировки для массивов.Смотрите это сообщение .

...