Счетчик лайков ката решение
Есть задача (ката с кодварс) : Реализуйте функцию likes :: [String] -> String, которая должна принимать входной массив, содержащий имена людей, которым нравится элемент. Он должен вернуть отображаемый текст, как показано в примерах.
likes [] // must be "no one likes this"
likes ["Peter"] // must be "Peter likes this"
likes ["Jacob", "Alex"] // must be "Jacob and Alex like this"
likes ["Max", "John", "Mark"] // must be "Max, John and Mark like this"
likes ["Alex", "Jacob", "Mark", "Max"] // must be "Alex, Jacob and 2 others like this"
Для 4 или более имен число and 2 others просто увеличивается.
Мое решение
function likes(names) {
var like = '';
if (names.length === 0) {
like = 'no one likes this';
}
else if (names.length === 1) {
like = (names[0] + ' likes this');
}
else if (names.length === 2) {
like = (names[0] + ' and ' + names[1] + ' like this');
}
else if (names.length === 3) {
like = (names[0] + ', ' + names[1]+ ' and ' + names[2] + ' like this');
}
else if (names.length >= 4) {
like = (names[0] + ', ' + names[1] + ' and ' + (names.length -2) + ' others' + ' like this');
}
return like;
}
Понимая что решение очень массивное,хотел бы увидеть более изящное решение.Заранее всем спасибо
Ответы (2 шт):
Автор решения: Dmitrii Sedov
→ Ссылка
Не знаю на сколько прикольно данное решение,
Можно соорудить например такое:
function likes(names) {
if (!names.length) return 'no one likes this';
const arrStr = [
names[1] ? (names.length == 2 ? ' and ' + names[1] : ',' + names[1]) : '',
names.length < 4 ? (names[2] ? ' and ' + names[2] : '') : (' and ' + (names.length - 2) + ' others'),
names.length == 1 ? ' likes' : ' like'
]
const result = `${names[0]}#s this`;
return result.replace('#s', arrStr.join(''));
}
const names = ["Peter"];
const names1 = ["Jacob", "Alex"];
const names2 = ["Max", "John", "Mark"];
const names3 = ["Alex", "Jacob", "Mark", "Max"];
console.log(likes(names));
console.log(likes(names1));
console.log(likes(names2));
console.log(likes(names3));
Или так например в строку:
function likes(names) {
if (!names.length) return 'no one likes this';
return `${names[0]}${names[1] ? (names.length == 2 ? ' and ' + names[1] : ',' + names[1]) : ''}${names.length < 4 ? (names[2] ? ' and ' + names[2] : '') : (' and ' + (names.length - 2) + ' others')} ${names.length == 1 ? 'likes' : 'like'} this`
}
const names = ["Peter"];
const names1 = ["Jacob", "Alex"];
const names2 = ["Max", "John", "Mark"];
const names3 = ["Alex", "Jacob", "Mark", "Max"];
console.log(likes(names));
console.log(likes(names1));
console.log(likes(names2));
console.log(likes(names3));
Автор решения: dmitriy_vlz
→ Ссылка
Ооо, помню такую "Кату". Я решал 2 способами:
function likes(names) {
if(names.length === 0) return "no one likes this";
if(names.length === 1) return names[0] + " likes this";
if(names.length === 2) return names[0] + " and " + names[1] + " like this";
if(names.length === 3) return names[0] + ", " + names[1] + " and " + names[2] + " like this";
return names[0] + ", " + names[1] + " and " + (names.length - 2) + " others like this";
}
и Вот так:
function likes(names) {
switch(names.length){
case 0:
return `no one likes this`;
case 1:
return `${names[0]} likes this`;
case 2:
return `${names[0]} and ${names[1]} like this`;
case 3:
return `${names[0]}, ${names[1]} and ${names[2]} like this`;
default:
return `${names[0]}, ${names[1]} and ${names.length - 2} others like this`;
}
}
Суть одна и та же, просто разные конструкции)