2016-10-27 6 views
0

Напишите функцию «getLengthOfShortestElement».найти первый экземпляр самого короткого элемента в массиве

Учитывая массив, «getLengthOfShortestElement» возвращает длину самой короткой строки в заданном массиве.

Примечания: * Он должен возвращать 0, если массив пуст.

Мой код:

function getLengthOfShortestElement(arr) { 

    if (arr.length === 0) return 0; 
     return arr.sort(function(a, b){ 
      return a.length> b.length; 
     }).unshift(); 
} 

getLengthOfShortestElement(['one', 'two', 'three']); // 3 

Почему не проходит тест, что он должен «обрабатывать связи», возвращая только первый экземпляр самого короткого элемента. Кроме того, есть ли лучший способ сделать пустой массив возвратом 0?

+2

, что вы имеете в виду «Почему не проходит тест, что он должен„обрабатывать связи“, возвращая только первый экземпляр самого короткого элемента ». ? Должен ли он возвращать длину или экземпляр? Неясно, –

+0

возвращает длину самой короткой строки в заданном массиве. Если более одного элемента имеют одну и ту же самую короткую длину, она возвращает длину только первой. Это обратная связь, которую я получаю от repl: Неудачные тесты it_should_handle_ties Дополнительная информация Ошибка: ожидается, что 3 будет 2. по адресу n – sopstem2428

+0

* «есть ли лучший способ сделать пустой массив return 0?» * - Что случилось с простой и прямой метод, который вы в настоящее время используете для этого? Кстати, ваша функция сортировки должна «возвращать a.length - b.length;» (компаратор не должен возвращать логическое значение). – nnnnnn

ответ

0

Поскольку Javascript Array.prototype.sort документация clearly states:

The sort() method sorts the elements of an array in place and returns the array. The sort is not necessarily stable.

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

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

def getFirstShortestElement(array): 
    if len(array) == 0: 
     return 0 
    firstSmall = 0 
    for index = 1 to len(array) - 1, inclusive: 
     if len(array[index]) < len(array[firstSmall]): 
      firstSmall = index 
    return array[firstSmall] 

As an aside, your function is spectacularly misnamed. It does not give you the "LengthOfShortestElement" at all. Function names should reflect what they do, you'll find your code much easier to maintain if you follow that rule :-)

+0

Как я должен решить это? – sopstem2428

+0

@ Tyler.Borer, обновленный с помощью * метода *, который вы можете использовать, это зависит от вас, чтобы превратить это в язык по вашему выбору. – paxdiablo

+0

Спасибо. Я следую приведенным упражнениям, это не худшее неправильное имя – sopstem2428

0

Он должен работает для всех случаев.

function getLengthOfShortestElement(arr){ 

    if (arr.length === 0) return 0; 

    var shortestLength = arr[0].length; 
    arr.forEach(function (each) { 
     shortestLength = each.length < shortestLength ? each.length : shortestLength; 
    }); 

    return shortestLength; 
} 
+0

* «Он должен вернуть 0, если массив пуст» * – nnnnnn

+0

Что делать, если все ваши строки имеют длину 10 000 000 символов? :-) – paxdiablo

1

Это может быть сделано с помощью редуктора.

function getLengthOfShortestElement(arr) { 

    if (!arr.length) return 0; 

    return arr.reduce(function(prev, current) { 

     if (prev === null) return current.length; 
     if (current.length < prev) return current.length; 

     return prev; 
    }, null); 
} 
+0

'.reduce()' это хороший способ сделать это, но код, который вы показали, не возвращает элемент *, он возвращает длину элемента. – nnnnnn

+0

@nnnnnn 'if (! Arr.length) return 0;' – tom10271

+1

Вместо того, чтобы начинать с 'null', вы можете просто начать с' Infinity' и перенести это первое условие. – Bergi

0

Я не получить то, что вы имеете в виду под «Почему не проходит тест, что он должен„обрабатывать связи“, возвращая только первый экземпляр самого короткого элемента».

Но возвращение 0 на пустой массив, я хотел бы сделать:

function getLengthOfShortestElement(arr){ 
    if (!arr){return 0} 
    //rest of your code 
} 
0

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

function getLengthOfShortestElement(arr) { 
    if (!arr || !arr.length) {return 0;} 
    arr = [].concat(arr); // Prevent altering the source array 
    return arr.sort(function (a, b) { 
     return a.length > b.length; 
    }).shift().length; 
} 

getLengthOfShortestElement(['one', 'two', 'three']); // 3 

Для длинных массивов, это, вероятно, быстрее, если вы путешествуете массив проверки длины:

function getLengthOfShortestElement(arr) { 
    if (!arr || !arr.length) {return 0;} 
    var minlength = (""+arr[0]).length; 
    for (var i = 1; i < arr.length; i++) { 
     var len = (""+arr[i]).length; 
     if (len < minlength) {minlength = len;} 
    } 
    return minlength; 
}