Оцените решение задачки, пжл
Читаю книжку "Выразительный 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, время: 06:00. |