Сортировка объектов в заданном порядке c после сортировки по целому значению - PullRequest
1 голос
/ 20 марта 2020

В настоящее время я пытаюсь отсортировать массив объектов в определенном порядке c.

В настоящее время я сортирую его по уровням - что работает нормально, но тогда мне нужно упорядочить его, как показано ниже, где Тип «Concatenator» должен быть только после и перед типом «Clause», как показано ниже:

[
  {
    "type": "Clause",
    "level": 1
  },
  {
    "type": "Concatenator",
    "level": 1
  },
  {
    "type": "Clause",
    "level": 2
  },
  {
    "type": "Concatenator",
    "level": 2
  },
  {
    "type": "Clause",
    "level": 2
  },
  {
    "type": "Concatenator",
    "level": 3
  },
  {
    "type": "Clause",
    "level": 3
  },
  {
    "type": "Concatenator",
    "level": 3
  },
  {
    "type": "Clause",
    "level": 3
  },
  {
    "type": "Concatenator",
    "level": 4
  },
  {
    "type": "Clause",
    "level": 4
  },
  {
    "type": "Concatenator",
    "level": 4
  },
  {
    "type": "Clause",
    "level": 4
  }
]

Ниже приведен код, который у меня сейчас есть, где он в данный момент сортируется просто по уровню, и попытка отсортировать его как Я хочу:

conditionsArr = [{
    "type": "Concatenator",
    "level": 3
  },
  {
    "type": "Clause",
    "level": 4
  },
  {
    "type": "Clause",
    "level": 1
  },
  {
    "type": "Concatenator",
    "level": 1
  },
  {
    "type": "Clause",
    "level": 3
  },
  {
    "type": "Clause",
    "level": 4
  },
  {
    "type": "Clause",
    "level": 3
  },
  {
    "type": "Concatenator",
    "level": 4
  },
  {
    "type": "Clause",
    "level": 2
  },
  {
    "type": "Concatenator",
    "level": 2
  },
  {
    "type": "Concatenator",
    "level": 3
  },
  {
    "type": "Clause",
    "level": 2
  },
  {
    "type": "Concatenator",
    "level": 4
  }
]


function sortByLevel(conditionsArr) {
  return conditionsArr.sort(function(a, b) {
    return a.level - b.level;
  }).sort(function(a, b) {
    if (a.type === b.type)
      return -1;
    return 0;
  });
}

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

Есть какие-нибудь предложения о том, как я могу это отсортировать?

1 Ответ

1 голос
/ 20 марта 2020

Вы можете

  • сгруппировать объекты по level,
  • , собрать для каждого level Clause и Concatenator в разных массивах
  • перестройте новый массив путем итерации сгруппированных объектов
  • , используйте переменную i, чтобы получить чередующиеся types.

var array = [{ type: "Concatenator", level: 3 }, { type: "Clause", level: 4 }, { type: "Clause", level: 1 }, { type: "Concatenator", level: 1 }, { type: "Clause", level: 3 }, { type: "Clause", level: 4 }, { type: "Clause", level: 3 }, { type: "Concatenator", level: 4 }, { type: "Clause", level: 2 }, { type: "Concatenator", level: 2 }, { type: "Concatenator", level: 3 }, { type: "Clause", level: 2 }, { type: "Concatenator", level: 4 }],
    order = { Clause: 0, Concatenator: 1 },
    temp = array.reduce((r, o) => {
        r[o.level] = r[o.level] || [[], []];
        r[o.level][order[o.type]].push(o);
        return r;
    }, {}),
    i = 0,
    result = Object
        .keys(temp)
        .sort((a, b) => a - b)
        .flatMap(k => {
            var r = [];
            while (temp[k][i].length) {
                r.push(temp[k][i].shift());
                i = 1 - i;
            }
            return r;
        });

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