JQuery / Javascript - Упорядочивать Array () мультипространственный

У меня есть следующий Array ():

{
    "1 ":
        {
            "id":"12",
            "usuarioA":"1",
            "usuarioB":"2",
            "mensaje":"Hola mi amor",
            "date":"2017-01-19 03:02:12",
            "TokenID":"1",
            "remitente":"Andrey Homez",
            "destinatario":"Paola Gonzales",
            "CVX":"Paola Gonzales"
        },
    "2 ":
        {
            "id":"13",
            "usuarioA":"1",
            "usuarioB":"3",
            "mensaje":"hey chaval",
            "date":"2017-01-19 03:11:11",
            "TokenID":"2",
            "remitente":"Andrey Homez",
            "destinatario":"Felipe Gomez",
            "CVX":"Felipe Gomez"
        },
    "13 ":
        {
            "id":"11",
            "usuarioA":"1",
            "usuarioB":"1",
            "mensaje":"Hablando conmigo mismo alv :"v",
            "date":"2017-01-19 02:52:13",
            "TokenID":"13",
            "remitente":"Andrey Homez",
            "destinatario":"Andrey Homez",
            "CVX":"Andrey Homez"
        }
}

Как я могу способствовать тому, чтобы она осталась упорядоченной индексом, "восходите" в нисходящей форме? А именно, что это осталось так:

{
    "2 ":
        {
            "id":"13",
            "usuarioA":"1",
            "usuarioB":"3",
            "mensaje":"hey chaval",
            "date":"2017-01-19 03:11:11",
            "TokenID":"2",
            "remitente":"Andrey Homez",
            "destinatario":"Felipe Gomez",
            "CVX":"Felipe Gomez"
        },
    "1 ":
        {
            "id":"12",
            "usuarioA":"1",
            "usuarioB":"2",
            "mensaje":"Hola mi amor",
            "date":"2017-01-19 03:02:12",
            "TokenID":"1",
            "remitente":"Andrey Homez",
            "destinatario":"Paola Gonzales",
            "CVX":"Paola Gonzales"
        },

    "13 ":
        {
            "id":"11",
            "usuarioA":"1",
            "usuarioB":"1",
            "mensaje":"Hablando conmigo mismo alv :"v",
            "date":"2017-01-19 02:52:13",
            "TokenID":"13",
            "remitente":"Andrey Homez",
            "destinatario":"Andrey Homez",
            "CVX":"Andrey Homez"
        }
}

Что-то важное что числа 1,2,13 они должны сохраняться (я не имею в виду Вашу команду).

Спасибо, заранее :)

1
задан 19.01.2017, 17:58
0 ответов

Проблема, чтобы начинаться, состоит в том, что твои данные не соответствуют массиву, если не в объект. Язык сценариев JavaScript не разбирается в ассоциативных массивах, в Вашем месте используй объекты и свойства, чтобы получать сходную функциональность.

Это значит, что методы как sort() они не доступны, чтобы реализовывать распорядок данных и, что хуже, язык сценариев JavaScript не гарантирует порядка свойств на протяжении жизни объекта, а следовательно результат должен бы быть в любом случае массивом, не новым объектом.

Чтобы исправлять эту проблему я рекомендую тебе производить твои данные как массив (используя delimitadores корень [] вместо {}). У тебя не будет какой-либо потери, потому что индекс стоимости, - в действительности, поле tokenID.

Как только было сделано это изменение очень просто использовать функцию сравнения, чтобы упорядочивать, как ты желаешь твои данные.

Если ты не можешь делать это изменение в твоем коде, тогда ты можешь делать превращение объект <-> массив, как он предложил тебе @PaperBirdMaster, но всегда лучше делать эту работу в источнике, чем в браузере клиента.

Это пример делания всего как объект (ты увидишь, что результат "реорганизуется"):

var datos = {
  "1":{
    "id":"12",
    "usuarioA":"1",
    "usuarioB":"2",
    "mensaje":"Hola mi amor",
    "date":"2017-01-19 03:02:12",
    "TokenID":"1",
    "remitente":"Andrey Homez",
    "destinatario":"Paola Gonzales",
    "CVX":"Paola Gonzales"
  },
  "2":{
    "id":"13",
    "usuarioA":"1",
    "usuarioB":"3",
    "mensaje":"hey chaval",
    "date":"2017-01-19 03:11:11",
    "TokenID":"2",
    "remitente":"Andrey Homez",
    "destinatario":"Felipe Gomez",
    "CVX":"Felipe Gomez"
  },
  "13":{
    "id":"11",
    "usuarioA":"1",
    "usuarioB":"1",
    "mensaje":"Hablando conmigo mismo alv :&quot;v",
    "date":"2017-01-19 02:52:13",
    "TokenID":"13",
    "remitente":"Andrey Homez",
    "destinatario":"Andrey Homez",
    "CVX":"Andrey Homez"
  }
};
var temp = [];
for (var i in datos) {
  array.push(datos[i]);
}
function sort(a,b){
  a = a.date;
  b = b.date;
  if(a < b) {
    return 1;
  } else if (a > b) {
    return -1;
  }
  return 0;
}
temp.sort(sort);
salida = {};
for (var i in temp) {
  salida[temp[i].TokenID] = temp[i];
}
console.log(salida);

И этот как массив (объявляя начала как массив данные, чтобы предотвращать цикл превращения):

var datos = [
  {
    "id":"12",
    "usuarioA":"1",
    "usuarioB":"2",
    "mensaje":"Hola mi amor",
    "date":"2017-01-19 03:02:12",
    "TokenID":"1",
    "remitente":"Andrey Homez",
    "destinatario":"Paola Gonzales",
    "CVX":"Paola Gonzales"
  },
  {
    "id":"13",
    "usuarioA":"1",
    "usuarioB":"3",
    "mensaje":"hey chaval",
    "date":"2017-01-19 03:11:11",
    "TokenID":"2",
    "remitente":"Andrey Homez",
    "destinatario":"Felipe Gomez",
    "CVX":"Felipe Gomez"
  },
  {
    "id":"11",
    "usuarioA":"1",
    "usuarioB":"1",
    "mensaje":"Hablando conmigo mismo alv :&quot;v",
    "date":"2017-01-19 02:52:13",
    "TokenID":"13",
    "remitente":"Andrey Homez",
    "destinatario":"Andrey Homez",
    "CVX":"Andrey Homez"
  }
];
function sort(a,b){
  a = a.date;
  b = b.date;
  if(a < b) {
    return 1;
  } else if (a > b) {
    return -1;
  }
  return 0;
}
datos.sort(sort);
console.log(datos);

В этом случае сравнение между датами простое благодаря тому, что они кажутся полученными от базы данных в формате yyyy-mm-dd HH:MM:SS что позволяет эквивалентность с прямым сравнением цепей символов.

Ты должен удостоверяться то, что эти даты были во всеобщем скоординированном времени, чтобы предотвращать проблемы со сравнениями в течение периодов изменения часа (я перехожу из летнего времени в зиму и наоборот).

4
ответ дан 03.12.2019, 17:37
  • 1
    ¿ Не está s упорядочивая даты alfabé ticamente? Alfabé ticamente "01-02-2017 00:00:00" меньше, чем "02-01-2017 00:00:00". –  19.01.2017, 16:29
  • 2
    Эса notació n даты она не правильна. notació n " informá tica" пойди верхней величины в нижний с наполнением нулей в десятках. Нотации má s просторно использованные это - Международная организация по стандартизации 8601 и Международная организация по стандартизации 9075. Они выносят оба (для того же часового пояса) comparació n текста как comparació n величины. Идеальное состоит в том, чтобы работать со всеобщим скоординированным временем, чтобы предотвращать проблемы solapamiento времени в полосах изменения часа. –  19.01.2017, 16:44
  • 3
    В mí tambié n он происходит со мной часто, обвиняет чтения rá попросите ;) –  19.01.2017, 19:30
  • 4
    Для mí funcionó má s é sta ответ, хотя có я говорю, что он не является таким переиспользуемым. –  19.01.2017, 20:10
  • 5
    @Má ximaAlekz, ¿ qué часть не является переиспользуемой? ¿ có mo podrí чтобы улучшать пример? –  19.01.2017, 21:01

Проблема.

У меня есть следующий Array ():

Нет, это не Array: это объект. Объекты не упорядочивают Ваши элементы.

Согласно определению объекта 3-ьего редактирования ECMAScript (перевод и выделенный мои):

4.3.3 Я возражаю

Объект - член типа Object. Это коллекция, не рукоположенная в свойства каждая из которых содержит примитивную стоимость, объект или функцию. Функция, сохраняемая в свойстве объекта известна в качестве метода.

Предложение.

Перемести элементы array, ты можешь делать это так:

var x = { ... todos tus datos ... };
var array = [];
for (var id in x)
{
    var obj = {};
    obj[id] = x[id];
    array.push(obj);
}

array языка сценариев JavaScript располагают функцией sort которая может получать (необязательно) параметр, который является функцией сравнения. Так что мы создадим функцию, которая приказывала бы нам обратным способом как свойством "date" объекта:

function date_descendente(a, b) {
    var split_a = a[Object.keys(a)[0]]["date"].match(/(\d+)/g);
    var split_b = b[Object.keys(b)[0]]["date"].match(/(\d+)/g);
    var date_a = new Date(split_a[0], split_a[1], split_a[2], split_a[3], split_a[4], split_a[5]);
    var date_b = new Date(split_b[0], split_b[1], split_b[2], split_b[3], split_b[4], split_b[5]);

    return date_b.getTime() - date_a.getTime();
}

А следовательно я смог подтверждать, объект Date он не состоит construible с форматом даты в том, что ты хранишь (если он не включал вторых, да он был бы construible). Так что я отделяю дату в каждом из компонентов и строю дату начиная с них со строителем, который получает год, в месяце, в день, час, минуту и секунду.

Чтобы упорядочивать наоборот просто я возвращаю вычитание между элементом правой стороны и элементом левой стороны, как функция распорядка нуждается в том, чтобы возвратить числовую стоимость, мы уменьшаем результат того, чтобы звонить в метод getTime каждый Date, что возвращает нам миллисекунды, прошедшие с первого января 1970 в 0 часов (которое является тем, что знает как Время UNIX).

Так что код остался бы следующего способа:

var array = [];
for (var id in x)
{
    var obj = {};
    obj[id] = x[id];
    array.push(obj);
}
array.sort(date_descendente);

И ты имел бы в array[0] объект "2", в 1 "12" и в 2 "13".

5
ответ дан 03.12.2019, 17:37
  • 1
    Я не уверен, что объект - muembro из Object. –  19.01.2017, 18:00