Задание по JS. Нужна адекватная критика

264
24 июня 2018, 09:40

Всем привет. Кодил я на Python, хотел всегда освоить дальше js. Знал какие-то базовые моменты. Недавно прислали мне задания, что бы проверить уровень знаний js. Сел написал первый свой код на js.

По итогу получил фидбек: задания выполнены неверно, потренеруйтесь и попробуйте снова.

Так вот суть вопроса в том, что я не против потренироваться, но мне нужен совет, что не так было сделано и что в конце концов я должен тренировать write.

Просто по факту все функции выполняют то, что требовалось в заданиях. Прошу вас глянуть и сказать в чем проблема то, может я действительно не правильно понял задания, либо же я как-то не по js-ий их выполнил, или не правильно оформил код. Всем заранее спасибо за ответ, а то ответ "задания выполнены неверно" не дает по ночам спать спокойно.

Задания: 1. In JavaScript write a function summing all array elements.

 function arraySum(array) {
     // your code goes here
 }
 arraySum([1, 2, 3, 4]) // 10
  1. Let's separate array iteration and an operation to be done. Write a function folding an array with any given function.
   function fold(array, operation) {
        // your code goes here
    }
    function add(a, b) { return a + b }
    function mul(a, b) { return a * b }
    fold([1, 2, 3, 4], add) // add(add(add(1, 2), 3), 4) === 10
    fold([1, 2, 3, 4], mul) // 24
  1. Add an optional parameter to start folding with.
function fold(array, operation, initial) {
    // your code goes here
    // hint: use arguments.length
}
fold([1, 2, 3, 4], add) // 10
fold([1, 2, 3, 4], add, 10) // add(add(add(add(10, 1), 2), 3), 4) === 20
fold([1, 2, 3, 4], mul, 10) // 240
fold([1, 2, 3, 4], add, '10') // '101234'
  1. Write the same fold function recursively. Do not simulate cycle via recursion.
function fold(array, operation, initial) {
    // your code goes here
    // hint: use array.slice
}

А вот сам код решений:

Task 1

  
 
function arraySum(array) { 
  var sum = 0; 
  for (var i = 0; i < array.length; i++) { 
    sum += array[i]; 
  }; 
  alert(sum); 
} 
arraySum([2, 4, 3]);

Task 2

function arraySum(array, operation) { 
  var answer = array[0]; 
  for (var i = 1; i < array.length; i++) { 
    if (operation == '+') { 
      answer += array[i]; 
    } else if (operation == '-') { 
      answer -= array[i]; 
    } else if (operation == '*') { 
      answer *= array[i]; 
    } else if (operation == '/') { 
      answer /= array[i]; 
    } 
  } 
  alert(answer); 
} 
arraySum([1, 2, 3, 4], '/');

Task 3

function arraySum(array, operation, initial) { 
  if (typeof initial == 'string') { 
    var answer = initial + array.join(''); 
  } 
 
  if (initial == undefined) { 
    var answer = array[0]; 
  } else if (operation == '+') { 
    var answer = initial + array[0]; 
  } else if (operation == '-') { 
    var answer = initial - array[0]; 
  } else if (operation == '*') { 
    var answer = initial * array[0]; 
  } else if (operation == '/') { 
    var answer = initial / array[0]; 
  } 
 
  for (var i = 1; i < array.length; i++) { 
    if (operation == '+') { 
      answer += array[i]; 
    } else if (operation == '-') { 
      answer -= array[i]; 
    } else if (operation == '*') { 
      answer *= array[i]; 
    } else if (operation == '/') { 
      answer /= array[i]; 
    } 
  } 
  alert(answer); 
} 
arraySum([1, 2, 3, 4], '+', '10');

Task 4

function arraySum(array, operation, initial) { 
  function startAnswer() { 
    if (typeof initial == 'string') { 
      var answer = initial + array.join(''); 
    } 
 
    if (initial == undefined) { 
      var answer = array[0]; 
    } else if (operation == '+') { 
      var answer = initial + array[0]; 
    } else if (operation == '-') { 
      var answer = initial - array[0]; 
    } else if (operation == '*') { 
      var answer = initial * array[0]; 
    } else if (operation == '/') { 
      var answer = initial / array[0]; 
    } 
    return answer; 
  } 
 
  var answer = startAnswer() 
 
  for (var i = 1; i < array.length; i++) { 
    if (operation == '+') { 
      answer += array[i]; 
    } else if (operation == '-') { 
      answer -= array[i]; 
    } else if (operation == '*') { 
      answer *= array[i]; 
    } else if (operation == '/') { 
      answer /= array[i]; 
    } 
  } 
  alert(answer); 
} 
arraySum([1, 2, 3, 4], '+');

https://drive.google.com/file/d/1B0nd1l0FRa2lAe6YelpKr8crri24_2-P/view?usp=sharing

Понятно, что может условий- if() слишком много, можно было как-то более элегантно сделать? Но это первый код на 'js' с базовыми знаниями. Правильно ли задания решены?

Всем спасибо за адекватную критику.

Answer 1

Все кроме последнего нацелены на использование функции reduce, она позволяет вычислять значение на базе массива, объяснять как работает нет смысла, найдете документацию.

1.

 function arraySum(array) { 
     return array.reduce((acc, val) => (acc + val), 0) 
 } 
arraySum([1, 2, 3, 4]) // 10

  1. начиная с этого и последующие вы делали не то, под operation подразумевается функция, которая будет выполнять операцию (add, mul)

  function fold(array, operation) { 
        return array.reduce((acc, val) => operation(acc, val)) 
  } 
  function add(a, b) { return a + b } 
  function mul(a, b) { return a * b } 
  fold([1, 2, 3, 4], add) // add(add(add(1, 2), 3), 4) === 10 
  fold([1, 2, 3, 4], mul) // 24

  1. function fold(array, operation, initial) { 
        return initial  
          ? array.reduce((acc, val) => operation(acc, val), initial) 
          : array.reduce((acc, val) => operation(acc, val)) 
    } 
    const add = (a, b) => (a + b) 
    const mul = (a, b) => (a * b) 
    fold([1, 2, 3, 4], add) // 10 
    fold([1, 2, 3, 4], add, 10) // add(add(add(add(10, 1), 2), 3), 4) === 20 
    fold([1, 2, 3, 4], mul, 10) // 240 
    fold([1, 2, 3, 4], add, '10') // '101234'

  2. тут нужно было использовать рукурсию

function fold(array, operation, initial) { 
    initial = initial || 0 
    const val = operation(initial, array.shift()) 
    if (array.length) return fold(array, operation, val) 
    return val 
} 
const add = (a, b) => (a + b) 
const mul = (a, b) => (a * b) 
fold([1, 2, 3, 4], add) // 10 
fold([1, 2, 3, 4], add, 10) // add(add(add(add(10, 1), 2), 3), 4) === 20 
fold([1, 2, 3, 4], mul, 10) // 240 
fold([1, 2, 3, 4], add, '10') // '101234'

READ ALSO
jquery Скрыть меню при повторном клике

jquery Скрыть меню при повторном клике

Друзья, подскажите как сделать, всю голову сломал) Хочу реализовать выпадающее меню по кликуВсё что задумал вроде получилось, но надо еще...

219
задать ставку в rambo dice faucethub

задать ставку в rambo dice faucethub

javascript не знаюВ процессе создания кода возникла необходимость ввести рассчитанную ставку в поле с кодом:

264