вернуть первое вхождение самой длинной строки в массиве Javascript

1

Моя задача - найти FIRST (а не самое длинное) появление самой длинной строки в массиве. Пробовал следовать, но продолжает возвращать второе появление...

function maxDigits (arr) {
var toStr = arr.map(value => String(value));
var longest = toStr.reduce(function (a, b) { return a.length > b.length ? a : b; })
return Number(longest)
}
maxDigits([12, 12345, 67890, 34])  // Getting 67890, target is 12345

Ваши предложения с некоторым объяснением желательно. Нет jQuery, пожалуйста. Очень признателен!

  • 1
    '12345'.length > '67890'.length ? '12345' : '67890' ... что он вернет?
  • 0
    const maxDigits = arr => arr.reduce((longest, item) => String(item).length > String(longest).length? item: longest);
Показать ещё 1 комментарий
Теги:
arrays

3 ответа

4
Лучший ответ

Вы хотите сохранить текущую строку, если следующая длина строки не больше, поэтому вместо сохранения текущей строки, только если длина больше, чем следующая, сохраните ее, если длина равна.

Используйте >= вместо > при сравнении длин:

a.length >= b.length ? a : b

или взять следующий, только если длина текущего меньше, чем следующая:

a.length < b.length ? b : a

или взять следующий, только если длина больше текущей:

b.length > a.length ? b : a

Пример:

function maxDigits(arr) {
  var toStr = arr.map(value => String(value));
  var longest = toStr.reduce(function(a, b) {
    return b.length > a.length ? b : a;
  })
  return Number(longest)
}

var result = maxDigits([12, 12345, 67890, 34]);

console.log(result);
  • 0
    спасибо, Ори !! это очень помогло плюс четкое объяснение!
  • 0
    Пожалуйста :)
0

Только с одной линией сокращения вы можете сделать следующее:

var nums   = [12, 12345, 67890, 34];
    result = nums.reduce((p,c) => Math.floor(Math.log10(p)) < Math.floor(Math.log10(c)) ? c : p);
console.log(result);

Примечание. Предполагая, что у вас есть целые числа, как показано в вашем примере (вместо строк), тогда Math.floor(Math.log10(n)) даст вам количество цифр n меньше 1, что достаточно для сравнения последовательных элементов массива и сохраняет наибольшее или первое из равных.

0

Или проще говоря...

console.log(
    [12, 12345, 67890, 34]
        .map(function(a) { return a.toString() })
          .reduce(function (a, b) { return a.length >= b.length ? a : b; })
);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню