Моя задача - найти 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, пожалуйста. Очень признателен!
Вы хотите сохранить текущую строку, если следующая длина строки не больше, поэтому вместо сохранения текущей строки, только если длина больше, чем следующая, сохраните ее, если длина равна.
Используйте >=
вместо >
при сравнении длин:
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);
Только с одной линией сокращения вы можете сделать следующее:
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, что достаточно для сравнения последовательных элементов массива и сохраняет наибольшее или первое из равных.
Или проще говоря...
console.log(
[12, 12345, 67890, 34]
.map(function(a) { return a.toString() })
.reduce(function (a, b) { return a.length >= b.length ? a : b; })
);
'12345'.length > '67890'.length ? '12345' : '67890'
... что он вернет?const maxDigits = arr => arr.reduce((longest, item) => String(item).length > String(longest).length? item: longest);