Сортировка массива внутри массива по алфавиту - PullRequest
0 голосов
/ 19 марта 2020

У меня есть такой массив:

const test = [
  {
    label: "C",
    options: [
      { label: "C"},
      { label: "B"}
    ]
  },
  {
    label: "A",
    options: [
      { label: "Z"},
      { label: "Y"}
    ]
  },
  {
    label: "B",
    options: [
      { label: "J"},
      { label: "H"}
    ]
  },
  {
    label: "D",
    options: [
      { label: "T"},
      { label: "B"}
    ]
  }
]

Мне нужно отсортировать этот массив в алфавитном порядке двумя способами:

1) По первой метке (вне массив опций)

2) И опции по метке

Пока мне удалось отсортировать только по первой метке, используя этот пример:

function compareStrings(a, b) {
  a = a.toLowerCase();
  b = b.toLowerCase();
  return (a < b) ? -1 : (a > b) ? 1 : 0;
}

test.sort(function (a, b) {
  return compareStrings(a.label, b.label)
})

Как можно также заказать опции внутри?


Ожидаемый выходной массив будет:

const test_SORTED = [
  {
    label: "A",
    options: [
      { label: "B"},
      { label: "C"}
    ]
  },
  {
    label: "B",
    options: [
      { label: "Y"},
      { label: "Z"}
    ]
  },
  {
    label: "C",
    options: [
      { label: "H"},
      { label: "J"}
    ]
  },
  {
    label: "D",
    options: [
      { label: "B"},
      { label: "T"}
    ]
  }
]

Ответы [ 2 ]

3 голосов
/ 19 марта 2020

При сортировке тестового массива я также отсортировал массив опций.

const test = [
  {
    label: "C",
    options: [
      { label: "C"},
      { label: "B"}
    ]
  },
  {
    label: "A",
    options: [
      { label: "Z"},
      { label: "Y"}
    ]
  },
  {
    label: "B",
    options: [
      { label: "J"},
      { label: "H"}
    ]
  },
  {
    label: "D",
    options: [
      { label: "T"},
      { label: "B"}
    ]
  }
];
function compareStrings(a, b) {
  a = a.toLowerCase();
  b = b.toLowerCase();
  return (a < b) ? -1 : (a > b) ? 1 : 0;
}

console.log(
    test.sort(function (a, b) {
        a.options = a.options.sort(function (c, d) {
            return compareStrings(c.label, d.label)
        })
        b.options = b.options.sort(function (e, f) {
            return compareStrings(e.label, f.label)
        })
        return compareStrings(a.label, b.label)
    })
)
0 голосов
/ 19 марта 2020

Вы должны отсортировать каждый из параметров элемента отдельно с помощью forEach l oop, чтобы избежать их многократной сортировки при выполнении в методе сортировки.

const comparator = (a, b) => (a.label < b.label ? -1 : a.label > b.label ? 1 : 0);
test.sort(comparator);
test.forEach(el => el.options.sort(comparator));

Кроме того, сортировка изменяет массив напрямую, поэтому нет необходимость присвоения значений опциям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...