вопрос о начальном начальном значении в функции уменьшения массива - PullRequest
0 голосов
/ 15 июня 2019

У меня действительно есть проблема, более того с инструкциями для этой домашней задачи, которые заключаются в следующем:

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

Вот разбивка того, что должно произойти:

// reduce([1,2], function(stored,current) {
//  return stored + current;
// }); → 3
// reduce([1,2], function(stored,current) {
//  return stored + current;
// },1); → 4

, если я читаюинструкции правильно, параметр start является начальным значением для начала накопления, нет?и если при вызове функции не указан параметр запуска, то значение с индексом 0 будет значением начала.Единственная проблема заключается в том, что когда это значение захватывается в тех случаях, когда не задан ни один параметр запуска, первое значение val накапливается дважды, что возвращает результат, который не ожидается.

На данный момент я изучил метод Reduce и различные способы начать с разных индексов.похоже, что если не указано начальное значение, мне нужно установить начальное значение в массив [0], а затем в массив.slice (1) и уменьшить его оттуда, однако я не совсем уверен, что это то, что говорит назначениесделать.

Я не совсем понимаю разницу между accumulator is not provided и start parameter is not provided.Если аккумулятор не указан, будет ли начальное значение первым значением во входном массиве, а начальный индекс будет равен 1?чтобы не добавлять / вычитать первое значение дважды?

вот мой код:

function reduce(array, callback, start) { 
    return array.reduce((acc, val, start) => {
      //if start value not provided, start value is index 0
        return callback(acc, val) }, start || array[0])
}

вот результаты.

//start provided as -1, result correct
var difference = function(tally, item) {return tally - item; };
var total = reduce([1, 2, 3], difference, -1); // expected -> -7 got -7

//start provded as 2, result correct
var add = function(tally, item) {return tally + item; };
var total = reduce([1, 2, 3], add, 2); // expected -> 8 got 8

//start not provided, first index used as start, as per instructions
//therefore first index is added twice, giving wrong answer
var add = function(tally, item) {return tally + item; };
var total = reduce([1, 2, 3], add); // expected -> 6 got 7

//start not provided, first index used as start, as per instructions
//therefore first index is subtracted twice, giving wrong answer
var difference = function(tally, item) { return tally - item; };
var total = reduce([1, 2, 3], difference); // -> expected -4 got -5

Ответы [ 2 ]

0 голосов
/ 15 июня 2019

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

В зависимости от того, задано ли start, вам нужно будет сделать два выбора: начальное значениеаккумулятора и нужно ли начинать итерацию с первого или второго элемента массива:

function reduce(array, callback, start) { 
    let start_index = start ? 0 : 1                   // start iteration on second item if start not given
    let acc = start === undefined ? array[0] : start  // use array[0] if start not given

    for (let i = start_index; i < array.length; i++){
        acc  = callback(acc, array[i])
    }
    return acc
}
var add = function(tally, item) {return tally + item; };

var total = reduce([1, 2, 3], add); // expected -> 6 got 7
console.log(total) // 6 as expected

var difference = function(tally, item) { return tally - item; };
var total = reduce([1, 2, 3], difference); // -> expected -4 got -5
console.log(total)  // -4 as expected
0 голосов
/ 15 июня 2019

Да, вы правы. Если начальный аккумулятор не указан, первый элемент массива принимается в качестве аккумулятора, и обратный вызов будет вызываться начиная со второго элемента.

Ваш код дублирует первый элемент массива, хотя и передает его в качестве аккумулятора. Также использование || здесь опасно, например, не удастся. 0. Я бы просто сделал:

 function reduce(array, callback, start) { 
   return array.reduce(callback, start);
 }
...