Как отсортировать объекты массива ob на основе ключей объектов? - PullRequest
0 голосов
/ 08 мая 2020

У меня есть массив в следующем порядке

[
  {
    "source": 0,
    "target": 1,
    "value": 22
  },
  {
    "source": 1,
    "target": 2,
    "value": 22
  },
  {
    "source": 0,
    "target": 1,
    "value": 19
  },
  {
    "source": 1,
    "target": 3,
    "value": 19
  },
  {
    "source": 0,
    "target": 1,
    "value": 12
  },
  {
    "source": 1,
    "target": 4,
    "value": 12
  },
  {
    "source": 0,
    "target": 1,
    "value": 3.230000000000002
  },
  {
    "source": 1,
    "target": 5,
    "value": 3.230000000000002
  },
  {
    "source": 0,
    "target": 6,
    "value": 109
  },
  {
    "source": 6,
    "target": 7,
    "value": 109
  },
  {
    "source": 0,
    "target": 6,
    "value": 25
  },
  {
    "source": 6,
    "target": 8,
    "value": 25
  },
  {
    "source": 0,
    "target": 6,
    "value": 20
  },
  {
    "source": 6,
    "target": 3,
    "value": 20
  },
  {
    "source": 0,
    "target": 6,
    "value": 17
  },
  {
    "source": 6,
    "target": 9,
    "value": 17
  },
  {
    "source": 0,
    "target": 6,
    "value": 13
  },
  {
    "source": 6,
    "target": 10,
    "value": 13
  },
  {
    "source": 0,
    "target": 6,
    "value": 11
  },
  {
    "source": 6,
    "target": 11,
    "value": 11
  },
  {
    "source": 0,
    "target": 6,
    "value": 7
  },
  {
    "source": 6,
    "target": 12,
    "value": 7
  },
  {
    "source": 0,
    "target": 6,
    "value": 7
  },
  {
    "source": 6,
    "target": 13,
    "value": 7
  },
  {
    "source": 0,
    "target": 6,
    "value": 6
  },
  {
    "source": 6,
    "target": 14,
    "value": 6
  },
  {
    "source": 0,
    "target": 6,
    "value": 4
  },
  {
    "source": 6,
    "target": 15,
    "value": 4
  },
  {
    "source": 0,
    "target": 6,
    "value": 2
  },
  {
    "source": 6,
    "target": 4,
    "value": 2
  }
]

Мне нужно отсортировать его в следующем порядке

[
  {
    "source": 0,
    "target": 1,
    "value": 3.230000000000002
  },
  {
    "source": 1,
    "target": 5,
    "value": 3.230000000000002
  },
  {
    "source": 0,
    "target": 1,
    "value": 12
  },
  {
    "source": 1,
    "target": 4,
    "value": 12
  },
  {
    "source": 0,
    "target": 1,
    "value": 19
  },
  {
    "source": 1,
    "target": 3,
    "value": 19
  },
  {
    "source": 0,
    "target": 1,
    "value": 22
  },
  {
    "source": 1,
    "target": 2,
    "value": 22
  },
  {
    "source": 0,
    "target": 6,
    "value": 2
  },
  {
    "source": 6,
    "target": 4,
    "value": 2
  },
  {
    "source": 0,
    "target": 6,
    "value": 4
  },
  {
    "source": 6,
    "target": 15,
    "value": 4
  },
  {
    "source": 0,
    "target": 6,
    "value": 6
  },
  {
    "source": 6,
    "target": 14,
    "value": 6
  },
  {
    "source": 0,
    "target": 6,
    "value": 7
  },
  {
    "source": 6,
    "target": 12,
    "value": 7
  },
  {
    "source": 0,
    "target": 6,
    "value": 7
  },
  {
    "source": 6,
    "target": 13,
    "value": 7
  },
  {
    "source": 0,
    "target": 6,
    "value": 11
  },
  {
    "source": 6,
    "target": 11,
    "value": 11
  },
  {
    "source": 0,
    "target": 6,
    "value": 13
  },
  {
    "source": 6,
    "target": 10,
    "value": 13
  },
  {
    "source": 0,
    "target": 6,
    "value": 17
  },
  {
    "source": 6,
    "target": 9,
    "value": 17
  },
  {
    "source": 0,
    "target": 6,
    "value": 20
  },
  {
    "source": 6,
    "target": 3,
    "value": 20
  },
  {
    "source": 0,
    "target": 6,
    "value": 25
  },
  {
    "source": 6,
    "target": 8,
    "value": 25
  },
  {
    "source": 0,
    "target": 6,
    "value": 109
  },
  {
    "source": 6,
    "target": 7,
    "value": 109
  }
]

Пока что я пробовал ниже, сначала сортировка на основе source,target and value, теперь я не знаю, как сортировать на втором этапе, чтобы добиться желаемого. Любая помощь / предложение будет оценено.

var data = [{
    "source": 0,
    "target": 1,
    "value": 22
  },
  {
    "source": 1,
    "target": 2,
    "value": 22
  },
  {
    "source": 0,
    "target": 1,
    "value": 19
  },
  {
    "source": 1,
    "target": 3,
    "value": 19
  },
  {
    "source": 0,
    "target": 1,
    "value": 12
  },
  {
    "source": 1,
    "target": 4,
    "value": 12
  },
  {
    "source": 0,
    "target": 1,
    "value": 3.230000000000002
  },
  {
    "source": 1,
    "target": 5,
    "value": 3.230000000000002
  },
  {
    "source": 0,
    "target": 6,
    "value": 109
  },
  {
    "source": 6,
    "target": 7,
    "value": 109
  },
  {
    "source": 0,
    "target": 6,
    "value": 25
  },
  {
    "source": 6,
    "target": 8,
    "value": 25
  },
  {
    "source": 0,
    "target": 6,
    "value": 20
  },
  {
    "source": 6,
    "target": 3,
    "value": 20
  },
  {
    "source": 0,
    "target": 6,
    "value": 17
  },
  {
    "source": 6,
    "target": 9,
    "value": 17
  },
  {
    "source": 0,
    "target": 6,
    "value": 13
  },
  {
    "source": 6,
    "target": 10,
    "value": 13
  },
  {
    "source": 0,
    "target": 6,
    "value": 11
  },
  {
    "source": 6,
    "target": 11,
    "value": 11
  },
  {
    "source": 0,
    "target": 6,
    "value": 7
  },
  {
    "source": 6,
    "target": 12,
    "value": 7
  },
  {
    "source": 0,
    "target": 6,
    "value": 7
  },
  {
    "source": 6,
    "target": 13,
    "value": 7
  },
  {
    "source": 0,
    "target": 6,
    "value": 6
  },
  {
    "source": 6,
    "target": 14,
    "value": 6
  },
  {
    "source": 0,
    "target": 6,
    "value": 4
  },
  {
    "source": 6,
    "target": 15,
    "value": 4
  },
  {
    "source": 0,
    "target": 6,
    "value": 2
  },
  {
    "source": 6,
    "target": 4,
    "value": 2
  }
];

data.sort(function(a, b) {
  return a.source - b.source || a.target - b.target || a.value - b.value;
});

console.log(JSON.stringify(data));

Дата обновления 1
Существует связь ч / б источника и цели. Сортированный массив должен быть в следующей последовательности:

наименьший элемент с именем "A" на основе источника, цели, значения
источник = наименьший источник
цель = наименьшая цель
значение = наименьшее значение

все элементы, которые
source = element A target
target =
Value = element A value
..................
Следующий меньший элемент с именем «B» на основе источника, цели, значения
источник = меньший источник
цель = меньшая цель
значение = меньшее значение

все элементы, которые имеют
source = element B target
target =
Value = element B value
...................
Следующий маленький элемент с именем "C "на основе источника, цели, значения
источник = малый источник
цель = маленькая цель
значение = малое значение

все элементы, которые
источник = элемент C target
target =
Value = element C value

так далее и так далее.

1 Ответ

3 голосов
/ 08 мая 2020

Вы можете сохранить ту же группу, просмотрев предыдущий target and following источник '', сгруппируйте их вместе, отсортируйте по значению и получите плоский массив объектов.

var data = [{ source: 0, target: 1, value: 22 }, { source: 1, target: 2, value: 22 }, { source: 0, target: 1, value: 19 }, { source: 1, target: 3, value: 19 }, { source: 0, target: 1, value: 12 }, { source: 1, target: 4, value: 12 }, { source: 0, target: 1, value: 3.230000000000002 }, { source: 1, target: 5, value: 3.230000000000002 }, { source: 0, target: 6, value: 109 }, { source: 6, target: 7, value: 109 }, { source: 0, target: 6, value: 25 }, { source: 6, target: 8, value: 25 }, { source: 0, target: 6, value: 20 }, { source: 6, target: 3, value: 20 }, { source: 0, target: 6, value: 17 }, { source: 6, target: 9, value: 17 }, { source: 0, target: 6, value: 13 }, { source: 6, target: 10, value: 13 }, { source: 0, target: 6, value: 11 }, { source: 6, target: 11, value: 11 }, { source: 0, target: 6, value: 7 }, { source: 6, target: 12, value: 7 }, { source: 0, target: 6, value: 7 }, { source: 6, target: 13, value: 7 }, { source: 0, target: 6, value: 6 }, { source: 6, target: 14, value: 6 }, { source: 0, target: 6, value: 4 }, { source: 6, target: 15, value: 4 }, { source: 0, target: 6, value: 2 }, { source: 6, target: 4, value: 2 }],
    result = data
        .reduce((r, o) => {
            let last = r[r.length - 1];
            if (last && last[last.length - 1].target === o.source) last.push(o);
            else r.push([o]);
            return r;
        }, [])
        .sort(([a], [b]) => a.source - b.source || a.target - b.target || a.value - b.value)
        .flat();

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...