Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Оцените решение задачки, пжл (https://javascript.ru/forum/misc/74647-ocenite-reshenie-zadachki-pzhl.html)

Dilettante_Pro 26.07.2018 17:43

Уж ежели автор использует push...
function reverseArray(array) {
    let output = [];
    do {
        output.push(array.pop());
    } while (array.length);
    return output;
}
alert(reverseArray([1,2,3,4,5]));


PS: лично мне естественней вариант автора, т.к. в задании -
Цитата:

Сообщение от MC-XOBAHCK
отдаёт новый массив в котором элементы идут в обратном порядке.

- ну и крути массив в обратном порядке.

MC-XOBAHCK 26.07.2018 17:52

Цитата:

Сообщение от j0hnik
сильно не загоняйтесь, стиль автора это не священный грааль, копировать не надо.

Цитата:

Сообщение от Rise
смотри на MDN for, там много ответов.

У меня хорошее понимание цикла for - вложенные циклы и сложная логика с ними внутри цикла меня не пугают и даже нравится такое решать.

Меня больше стиль кода интересует, где логику делать в параметрах или внутри. А то когда нить устроишься поработать, а "коллеги" спросят что за колхозный ниндзя код и сломают нос. А мне носик жалко, т.к. он у меня один.

Dilettante_Pro 26.07.2018 18:00

Цитата:

Сообщение от Rise
не, do здесь не очень, когда массив пустой

Ну и что? Пустой - он и в Африке пустой
function reverseArray(array) {
    let output = [];
    do {
        output.push(array.pop());
    } while (array.length);
    return output;
}
alert(JSON.stringify(reverseArray([])));

Хотя лучше, конечно, так
function reverseArray(array) {
    let output = [];
    while (array.length) {
        output.push(array.pop());
    } ;
    return output;
}
alert(JSON.stringify(reverseArray([])));

MC-XOBAHCK 26.07.2018 18:03

Наверное я непонятно спросил, меня решение той задачки не интересует.
Вот другая задачка автора книги:
Вызываем функцию
range(21, 54, 2)

она должна вернуть сумму чисел в диапазоне 1 и 2 параметра (21, 54), а третьий параметр - шаг чисел
// Сумма диапазона
function range(start, end, step = start < end ? 1 : -1) {
    let array = [];

    if (step > 0) {
        for (let i = start; i <= end; i += step) array.push(i);
    } else {
        for (let i = start; i >= end; i += step) array.push(i);
    }
    return array;
}

Вот у него опять в параметры пошла логика решения задачи (step =...). А я сделал решение где это внутри функции.
Меня этот стиль кодирования интересует.

MC-XOBAHCK 26.07.2018 18:08

Цитата:

Сообщение от Rise
ну логики туда много не засовывают, индексы только, обычно это сжиматели делают для минификации кода, вот они туда могут насувать прилично.

Во-во, у меня непонятки, то он понты так лепит или это общепринятый стиль у продвинутых проггеров. Я тоже хочу к продвинутым и готов подражать ихнему стилю если таков есть.

j0hnik 26.07.2018 18:09

родной реверс так работает, с обоих сторон фигачит =)
2 перестановки за итерацию
function reverse(array) {
  var j = array.length - 1;
  for (var i = 0; i < j; i++, j--) {
    [array[i], array[j]] = [array[j], array[i]];
  }
  return array;
}

Dilettante_Pro 26.07.2018 18:37

Цитата:

Сообщение от Rise
присвоение в параметре функции

И, кстати, не работает.
function range(start, end, step = start < end ? 1 : -1) {
    let array = [];

    if (step > 0) {
        for (let i = start; i <= end; i += step) array.push(i);
    } else {
        for (let i = start; i >= end; i += step) array.push(i);
    }
    return array;
}
alert(range(54,21,2));

Это решение автора?

Nexus 26.07.2018 18:42

Dilettante_Pro, судя по комментарию функция должна была вообще сумму диапазона возвращать, а не сам диапазон...

MC-XOBAHCK 26.07.2018 18:54

Цитата:

Сообщение от Dilettante_Pro
Это решение автора?

Извините, это я напутал - эта функция возвращает только массив чисел в указанном диапазоне с шагом.
Вот полностью решение, там вторая функция (это практические задачки по закреплению пройденного материала):
// Сумма диапазона
function range(start, end, step = start < end ? 1 : -1) {
    let array = [];

    if (step > 0) {
        for (let i = start; i <= end; i += step) array.push(i);
    } else {
        for (let i = start; i >= end; i += step) array.push(i);
    }
    return array;
}

function sum(array) {
    let total = 0;
    for (let value of array) {
        total += value;
    }
    return total;
}
console.log(sum(range(1, 10)));  // → 55
console.log(range(5, 2, -1));    // [5, 4, 3, 2]


Спасибо всем за участие в этой непонятной теме.
В общем я понял что повторяющиеся вычисления в цикле если возможно выносим в условие, а в параметры функции - это уже понты.

Dilettante_Pro 26.07.2018 18:59

Nexus,
Да она ничего не возвращает - хоть сумму, хоть диапазон...


Часовой пояс GMT +3, время: 05:55.