• Как отсортировать часть массива?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    const a =  [2, 'No', 6, 8, '', 1, 'No', '', 10];
    const nums = a.filter(Number.isFinite).sort((x,y)=>x-y);
    
    console.log(a.map(v => Number.isFinite(v) ? nums.pop() : v));
    Ответ написан
    6 комментариев
  • Как отсортировать часть массива?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const numSort = (arr) => arr.reduce(
      (acc, c, i) => {
        if (Number.isFinite(c)) arr.splice(i, 1, acc.shift());
        return acc.length ? acc : arr;
      },
      arr.filter((el) => Number.isFinite(el)).sort((a, b) => b - a)
    );
    
    numSort([2, "No", 6, 8, "", 1, "No", "", 10])
    // [ 10, "No", 8, 6, "", 2, "No", "", 1 ]
    как работает

    arr.filter((el) => Number.isFinite(el)).sort((a, b) => b - a)
    эта строка отбирает из массива только числа и сортирует их по убыванию. Получившийся сортированный массив чисел используется в reduce() как аккумулятор.

    reduce() проходит по всем элементам исходного массива. Если встретилось число (не важно, какое), его заменяет на очередное (по убыванию) из полученного выше сортированного массива. Наконец, если массив с числами опустел – возвращается полностью обработанный массив.

    После замены последнего числа возвращается основной массив. И прокручиваются оставшиеся не-числа. С ними условие не срабатывает и больше замен не происходит.

    Фиддл


    upd. в реале ТС требовалось работать с массивом объектов. Тогда так:
    {
    const arr = [{ACCOUNT: 2, PAY: "bla"},
    {ACCOUNT: "No", PAY: "bla"},
    {ACCOUNT: 6, PAY: "bla"},
    {ACCOUNT: 8, PAY: "bla"},
    {ACCOUNT: "", PAY: "bla"},
    {ACCOUNT: 1, PAY: "bla"},
    {ACCOUNT: "No", PAY: "bla"},
    {ACCOUNT: "", PAY: "bla"},
    {ACCOUNT: 10, PAY: "bla"}];
    
    
    const nums = arr.filter((el) => Number.isFinite(el.ACCOUNT)).sort((a, b) => b.ACCOUNT - a.ACCOUNT);
    const result = arr.map((el) => Number.isFinite(el.ACCOUNT) ? nums.shift() : el);
    
    console.log(result);
    }
    Ответ написан
    3 комментария