У меня есть сценарий, в котором у меня есть массив массивов, содержащих объект, и мне нужно отсортировать массив, в котором внутренние массивы длины 1 отображаются вверху, а внутренние массивы длиной больше единицы сортируются на основе значений внутри объекта.

let a = [[{c:"11-01-2020"}], [{c:"12-01-2020"}, {c:"12-01-2020"}], [{c:"13-01-2020"}, {c:"13-01-2020"}], [{c:"14-01-2020"}]]

function sortfn(a, b) {
  if (a.length === 1 && b.length === 1) {
    return 0;
  }
  if (a.length === 1 ||
    (a[0].c > b[0].c) &&
    a.length !== 1 &&
    b.length !== 1
  ) {
    return -1;
  }
  return 1;
}

a.sort(sortfn);

console.log(a)

Результат должен быть

[[{c:"11-01-2020"}], [{c:"14-01-2020"}]], [{c:"13-01-2020"}, {c:"13-01-2020"}], [{c:"12-01-2020"}, {c:"12-01-2020"}]]
1
kishore Rajendran 30 Ноя 2020 в 18:42

3 ответа

Лучший ответ

Вы можете сначала проверить длину, а затем отсортировать по строкам даты.

const
    getISODate = custom => custom.replace(/^(\d{2})-(\d{2})-(\d{4})$/, '$3-$2-$1'),
    sortFn = (a, b) => (b.length === 1) - (a.length === 1) || getISODate(a[0].c).localeCompare(getISODate(b[0].c)),
    array = [[{ c: "11-01-2020" }], [{ c: "12-01-2020" }, { c: "12-01-2020" }], [{ c: "13-01-2020" }, { c: "13-01-2020" }], [{ c: "14-01-2020" }]]

array.sort(sortFn);

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1
Nina Scholz 30 Ноя 2020 в 17:51

У вас это не работает?

let a = [[{c:2}], [{c:4}, {c:4}], [{c:3}, {c:3}], [{c:1}]]

a.sort((a,b) => a[0].c - b[0].c);

console.log(a)
0
mplungjan 30 Ноя 2020 в 15:51

Я изменил сообщение выше, чтобы отсортировать его по дате, и это сработало.

Спасибо

function sortfn(a, b) {
    return (b.length === 1) - (a.length === 1) || new Date(b[0].c) - new Date(a[0].c);
}

let a = [[{ c: "11-11-2020" }], [{ c: "12-11-2020"  }, { c: "12-11-2020"  }], [{ c: "13-11-2020"  }, { c: "13-11-2020"  }], [{ c :"14-11-2020"  }]];

a.sort(sortfn);

console.log(a);
0
kishore Rajendran 30 Ноя 2020 в 16:41