Сортировка по ключу Y [дубликат]

108
07 ноября 2019, 07:00

На данный вопрос уже ответили:

  • Сортировка объекта в javascript 2 ответа
  • Обращение к объекту, как к массиву 4 ответа

подскажите как можно выполнить сортировку по возрастанию по y в данном массиве объектов:

var Objs = {
    0.98401984: {
        1: {
            x: 123,
            y: 123,
        },
        2: {
            x: 123,
            y: 123,
        },
        3: {
            x: 123,
            y: 123,
        },
    },
    0.12930572: {
        1: {
            x: 456,
            y: 456,
        },
        2: {
            x: 456,
            y: 456,
        },
        3: {
            x: 456,
            y: 456,
        },
     0.2309328: {
        1: {
            x: 789,
            y: 789,
        },
        2: {
            x: 789,
            y: 789,
        },
        3: {
            x: 789,
            y: 789,
        },
    },

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

Answer 1

это то что вам надо

var Objs = {
    0.98401984: {
        1: {
            x: 123,
            y: 5,
        },
        2: {
            x: 123,
            y: 1,
        },
        3: {
            x: 123,
            y: 12,
        },
    },
    0.12930572: {
        1: {
            x: 456,
            y: 4342356,
        },
        2: {
            x: 456,
            y: 4256,
        },
        3: {
            x: 456,
            y: 423456,
        },
    },
    0.2309328: {
        1: {
            x: 789,
            y: -789,
        },
        2: {
            x: 789,
            y: 2342789,
        },
        3: {
            x: 789,
            y: 23789,
        },
    },
}

for (const key in Objs) {
    var temp =[];
    for (const key2 in Objs[key]) {
        temp.push(Objs[key][key2]);
    }
    temp = temp.sort((a, b) => a.y - b.y);
    Objs[key] = {};
    for (let i= 0; i < temp.length; i++) {
        Objs[key][i + 1] = temp[i];
    }
}

console.log(Objs);

Выведет

{ '0.98401984':
   { '1': { x: 123, y: 1 },
     '2': { x: 123, y: 5 },
     '3': { x: 123, y: 12 } },
  '0.12930572':
   { '1': { x: 456, y: 4256 },
     '2': { x: 456, y: 423456 },
     '3': { x: 456, y: 4342356 } },
  '0.2309328':
   { '1': { x: 789, y: -789 },
     '2': { x: 789, y: 23789 },
     '3': { x: 789, y: 2342789 } } }

вот тогда почитал ваш комент

var tempY = [];
for (const key in Objs) {
    for (const key2 in Objs[key]) {
        tempY.push({
            name: key,
            data: {
                y: Objs[key][key2].y,
                x: Objs[key][key2].x
            }
        })
    }
}

var highest = tempY.sort((a, b) => b.data.y - a.data.y)[0];

var result = {};
var names = Array.from(new Set(tempY.map(v => v.name)));
for (const value of names) {
    var local = {};
    var data = tempY.filter(v => v.name == value).map(v => v.data).sort((a, b ) => a.y - b.y);
    for (let index = 0; index < data.length; index++) {
        local[index + 1] = {
            x: data[index].x,
            y: data[index].y
        }
    }
    result[value] = local
}
console.log(result);

Выведет

{ '0.12930572':
   { '1': { x: 456, y: 4256 },
     '2': { x: 456, y: 423456 },
     '3': { x: 456, y: 4342356 } },
  '0.2309328':
   { '1': { x: 789, y: -789 },
     '2': { x: 789, y: 23789 },
     '3': { x: 789, y: 2342789 } },
  '0.98401984':
   { '1': { x: 123, y: 1 },
     '2': { x: 123, y: 5 },
     '3': { x: 123, y: 12 } } }
Answer 2

Чтобы отсортировать объект, его нужно превратить в массив

let Objs = [ 
   { 
  1: { 
      x: 123, 
      y: 123, 
  }, 
  2: { 
      x: 123, 
      y: 123, 
  }, 
  3: { 
      x: 123, 
      y: 123, 
  }, 
  }, 
   { 
  1: { 
      x: 456, 
      y: 456, 
  }, 
  2: { 
      x: 456, 
      y: 456, 
  }, 
  3: { 
      x: 456, 
      y: 456, 
  }, 
}, 
{ 
  1: { 
      x: 789, 
      y: 789, 
  }, 
  2: { 
      x: 789, 
      y: 789, 
  }, 
  3: { 
      x: 789, 
      y: 789, 
  }, 
  }, 
]; 
 
Objs[2][1].y = 100 
 
Objs = Objs.sort((a,b) => { 
   return a[1].y-b[1].y 
}); 
console.log(Objs)

Какой вопрос - такой ответ((

Answer 3

Объект сортировать геморройно и бессмысленно. Если вам нужно ВЫВОДИТЬ куда-то объект, сохраняя определенный порядок свойств, то создайте массив, в который выведите эти свойства в нужном порядке:

var ObjIndexer = ["0.98401984", "0.12930572", "0.2309328", ...]

Если потом вам требуется дергать функцию, которая принимает только объекты, передавая ей их в нужном порядке, передавайте их, например, в цикле, перебирающем вышеуказанный массив:

for (i = 0; i < ObjIndexer.length; i++) {
    your_function(Objs[ObjIndexer[i]]);
}
READ ALSO
#1062 - Дублирующаяся запись &#39;235-74&#39; по ключу &#39;PRIMARY&#39;

#1062 - Дублирующаяся запись '235-74' по ключу 'PRIMARY'

Мне надо заменить в БД значение ячейки, если оно попадает под условиеДелаю такой запрос:

134
mysql вывод записей за месяц

mysql вывод записей за месяц

как вывести записи за неделю и месяц

134