Оцените решение задачки, пжл
Читаю книжку "Выразительный JavaScript" и решаю каждую задачку из неё.
Проблема в том, что у меня ещё ни разу не совпало решение с решением автора. Как пример задачка Реверсирование массива - написать функцию которая получает массив и отдаёт новый массив в котором элементы идут в обратном порядке. Без проблем пишу такое решение: function reverseArray(arr) { let newArr = []; for (let i = 0; i < arr.length; i++) { newArr[i] = arr[arr.length - 1 - i]; } return newArr; } А вот вариант автора: function reverseArray(array) { let output = []; for (let i = array.length - 1; i >= 0; i--) { output.push(array[i]); } return output; } У автора идёт логическое решение в условии цикла, а у меня же внутри цикла. Подобная картина со всеми задачками что я решал. Посоветуйте, мне стоит переосмыслить стиль кода и делать как автор, прописывая логику в условии (думаю так тоже смогу, просто нужно некоторое время для адаптации и привыкания), или я нормально делаю и никакой разницы нет. Просто я уже размечтался годика через два-три попробовать работать JS-программистом и пока прокачиваюсь знаниями, нужно и стиль подтягивать к тому как это делают профи. |
Цитата:
я б так решил function reverseArray(arr) { return arr.map((el,i)=> arr[arr.length-1-i]); } |
Там где то будут примеры которые автор решает несколькими способами:
1) двухэтажной рекурсией (много буков и медленно) 2) вложенным циклом (быстро и меньше буков) и как бы пишет что рекурсия зато более проста для восприятия, хотя для меня цикл было намного проще понять. так что вот так вот. |
Цитата:
Я просто заметил что у меня всегда однотипная разница - у автора всегда логика в условие попадает. Вот меня и взяло сомнение, может стоить правильно делать в его стиле, а то как я делаю не используется в серьёзной разработке. |
Цитата:
ох и автор :D |
Цитата:
Там в той книжке у него и в if() обычно логика засунута, вот я всё в кучу как условие определил, заметив что это как стиль написания кода идёт. |
for (инициализация; условие; выражение )
|
Цитата:
|
Цитата:
|
MC-XOBAHCK,
сильно не загоняйтесь, стиль автора это не священный грааль, копировать не надо, извлекайте для себя полезное и пользуйтесь, не более того. |
Уж ежели автор использует push...
function reverseArray(array) { let output = []; do { output.push(array.pop()); } while (array.length); return output; } alert(reverseArray([1,2,3,4,5])); PS: лично мне естественней вариант автора, т.к. в задании - Цитата:
|
Цитата:
Цитата:
Меня больше стиль кода интересует, где логику делать в параметрах или внутри. А то когда нить устроишься поработать, а "коллеги" спросят что за колхозный ниндзя код и сломают нос. А мне носик жалко, т.к. он у меня один. |
Цитата:
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([]))); |
Наверное я непонятно спросил, меня решение той задачки не интересует.
Вот другая задачка автора книги: Вызываем функцию 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 =...). А я сделал решение где это внутри функции. Меня этот стиль кодирования интересует. |
Цитата:
|
родной реверс так работает, с обоих сторон фигачит =)
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; } |
Цитата:
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)); Это решение автора? |
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] Спасибо всем за участие в этой непонятной теме. В общем я понял что повторяющиеся вычисления в цикле если возможно выносим в условие, а в параметры функции - это уже понты. |
Nexus,
Да она ничего не возвращает - хоть сумму, хоть диапазон... |
Dilettante_Pro, chrome v67.0.3396.99 возвращает массив.
|
Цитата:
У меня работает и возвращает массив. |
Меня логика в объявлении параметров и 2 почти одинаковых цикла подбешивают.
Я бы как-нибудь так лучше сделал (не знаю как условие сократить, а очень хочется): function range(start, end, step) { step = step !== undefined ? step : (start < end ? 1 : -1); let array = []; for (let i = start; step > 0 && i <= end || step < 0 && i >= end; i += step) array.push(i); return array; } |
MC-XOBAHCK,
Сумма диапазона, а без циклов решение сможешь? |
рони, с шагом отличным от 1?
|
Nexus,
с любым шагом 1,2,5,-7,-1 ... условие одно, никаких циклов |
рони,
через рекурсию? |
Nexus,
alert(fun(10,1,-1)); alert(fun(1,10,1)); alert(fun(10,1)); alert(fun(1,10)); все вызовы вернут 55 |
Alexandroppolus,
без рекурсии |
Цитата:
|
рони,
т.е. дан массив, индексы начала и конца, шаг, и надо найти сумму элементов, без цикла, рекурсии, всяких трюков с setInterval и т.д.? Синхронным кодом? Методы массивов использовать можно? |
:) смотрите пост №28 Nexus,
уберите циклы и верните сумму |
Цитата:
|
а, теперь понял.
Тут всё в кучу, в этом топике ) сумма арифметической прогрессии, в общем. По формуле все вычисляется |
Цитата:
|
Цитата:
|
Цитата:
только с шагом это не прокатит. |
сумма арифметической прогрессии
MC-XOBAHCK,
function fun(start, end, step) { step = step || (start > end ? -1 : 1); var n = (end - start) / step | 0; return (start + n * step / 2) * ++n } alert(fun(10, 1, -1)); alert(fun(1, 10, 1)); alert(fun(10, 1)); alert(fun(1, 10)); https://javascript.ru/forum/misc/731...-shagom-2.html |
рони,
не, так бы я точно не смог. Я начал просто вот так в столбик расписывать и приводить к формуле: n + (n + 1) + (n + 2) + (n + 3) + (n + 4) + (n + 5) = n + n * (1 + 2 + 3 + 4 + 5 + ........); получается в скобках выражение заходит под формулу: end * (end + 1) * 0.5, но в ней end = end - start start + start * ((end - start) * (end - start + 1) * 0.5) Это получилась формула для последовательных чисел, если не наделал ошибок. А как к ней шаг прикрутить я завис без каких либо идей. +++++++++++++ Запустил на тест и сразу вижу 2 ошибки когда n выносил как множитель в прорисовке макета формулы. n * (1 + 2 + 3 + 4 + 5 + 6 + ........); |
Ошибки разобрал. Вот такая получается функция суммы последовательных чисел если делать через арифметическую формулу:
function sum(start, end) { return start * ((end - start + 1) * (end - start + 2) * 0.5); } console.log(sum (1, 4)); // 10 !!! Функция работает НЕПРАВИЛЬНО!!! Где то ошибка в формуле, не могу понять. console.log(sum(2, 5)); |
Часовой пояс GMT +3, время: 10:42. |