2014-12-17 3 views
0

Целью является создание функции, которая принимает два аргумента: массив не повторяющихся чисел и строку (либо «значение», либо «индекс») и возвращают либо наименьшее значение в массиве или индекс наименьшего числа в массиве, в зависимости от этого второго аргумента.Определение индекса наименьшего числа в массиве с использованием сокращения

мне действительно нужно практиковать возвраты и некоторые методы массива, так что я придумал:

function min(arr, toReturn) { // toReturn takes either 'value' or 'index' 
    return arr.reduce(function(sofar, current, index) { 
    return (toReturn == 'value') ? Math.min(sofar, current) : arr.indexOf(Math.min(sofar, current)); 
});} 

console.log(min([7,22,3,4,5],'index')); 

Он работает при установке на «ценности», но делает страшный -1 для «индекса».

Где я ошибаюсь здесь синтаксис?

+0

для чего используется второй аргумент? Если вам нужно найти индекс минимального элемента массива, второй arg выглядит нечетным. – Evgeniy

+0

Это характер функции: он смотрит на второй аргумент (строку), чтобы вернуть либо самое маленькое значение (значение), либо индекс наименьшее значение ('index') – zahabba

+0

О, так что его просто флаг, что мы должны вернуть самому маленькому значению или его индексу в массиве? – Evgeniy

ответ

0

При возврате индекса вы сравниваете индекс предыдущего вызова со значением следующего члена. В первом вызове, который будет 0, так как мин 7 и 22: 7, который является членом 0:

arr.indexOf(Math.min(7,22)) 

поэтому функция возвращает 0.

В следующем сравнении, 0 меньше 3 и arr.indexOf(0) будет возвращать -1, поскольку в массиве нет нуля. Все последующие вызовы возвращают -1, а так как нет -1, indexOf возвращает -1, ad infinitum.

Я думаю, что с помощью Math.min неэффективна, рассмотреть вопрос об использовании менее чем оператор < вместо и помните самый низкий показатель, как вы идете, сэкономив вызов IndexOf также.

Ожидается, что idx будет логическим или правдивым/ложным, что проще, чем «индекс» или «значение». Значение по умолчанию - вернуть наименьшее значение.

function getLowest(arr, idx) { 
    var index = 0, value = arr.reduce(function(pre, cur, i) { 
    return cur < pre? (index = i) && cur : pre; 
    }); 
    return idx? index : value; 
} 

console.log(getLowest([7,22,3,4,5]));  // 3 
console.log(getLowest([7,22,3,4,5], true)); // 2 

Это может быть дополнительная линия или два, но я буду держать пари < быстрее, чем Math.min. ;-)

+0

Вы правы; indexOf вызывается при каждом вызове, и я намеревался его называть только тогда, когда было достигнуто окончательное (минимальное) число. – zahabba

+0

Прохладный, поэтому используйте «var value = arr.reduce (...); индекс возврата? arr.indexOf (значение): значение; '. Но я предпочитаю избегать вызова * indexOf *. ;-) – RobG

0

Вот возможная реализация с reduce Вы обеспечиваете, чтобы уменьшить объект с начальным состоянием

{value: Infinity, index: null}

value величиной минимального эля

index индекс минимального эля

На уменьшите вы сравниваете пункт curren с минимальным и если его небольшие поля объекта обновления после окончания цикла просто введите код, который вам нужно заполнить flag

function arrMin(arr, flag) { 

    return arr.reduce(function(m, item, index){ 
    if(item < m.value) { 
     m.value = item; 
     m.index = index 
    } 

    return m; 
    }, {value: Infinity, index: null})[flag] 
} 
+0

Зачем инициализировать * index * to * null *? Поскольку вы устанавливаете * значение * на максимально возможное значение, почему бы не установить * index * на наименьший возможный индекс (т. Е. 0)? Или, может быть, -1? Кстати, это не отвечает OP: «* Здесь я ошибаюсь ... *». – RobG

+0

@RobG, чтобы избежать косвенной связи с результатом 'inArray', если elem не найден. Но его нормально использовать «-1» в качестве начального значения – Evgeniy

+0

@RobG, заголовок вопроса сообщает абстрактный вопрос «Определение индекса ...», поэтому мой ответ - возможная реализация, как достичь этой цели. О «Где я иду не так». Я думаю, что его неправильный подход в сокращении обратного вызова, вот почему я предлагаю еще один – Evgeniy

Смежные вопросы