JS массив объектов

131
07 декабря 2020, 10:00

Я только начинаю учить JS и застряла на одном задании, прошу вашей помощи.

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

const instructorWithLongestName = function(instructors) {
  // Put your solution here
};
console.log(instructorWithLongestName([
  {name: "Samuel", course: "iOS"},
  {name: "Jeremiah", course: "Web"},
  {name: "Ophilia", course: "Web"},
  {name: "Donald", course: "Web"}
]);
console.log(instructorWithLongestName([
  {name: "Matthew", course: "Web"},
  {name: "David", course: "iOS"},
  {name: "Domascus", course: "Web"}
]);

Вывод должен быть таким:

{name: "Jeremiah", course: "Web"}
{name: "Domascus", course: "Web"}

Решение должно быть на чистом JS без использования каких-либо библиотек.
Спасибо, тем кто отзовется и поможет.

Answer 1

Изначальный вариант с сортировкой (ну почти изначальный... :):

const instructorWithLongestName = function(instructors) { 
  return instructors. 
    sort((a,b) => b.name.length - a.name.length)[0]; 
}; 
 
console.log(instructorWithLongestName([ 
  {name: "Samuel", course: "iOS"}, 
  {name: "Jeremiah", course: "Web"}, 
  {name: "Ophilia", course: "Web"}, 
  {name: "Donald", course: "Web"} 
])); 
console.log(instructorWithLongestName([ 
  {name: "Matthew", course: "Web"}, 
  {name: "David", course: "iOS"}, 
  {name: "Domascus", course: "Web"} 
]));

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

const instructorsWithLongestName = function(instructors) { 
  //Игнорируем отсутствие параметров 
  if (!instructors) return []; 
   
  return instructors. 
    sort((a,b) => b.name.length - a.name.length). 
    filter((a,b,c) => a.name.length == c[0].name.length); 
}; 
 
console.log(instructorsWithLongestName([ 
  {name: "Samuel", course: "iOS"}, 
  {name: "Jeremiah", course: "Web"}, 
  {name: "Ophilia", course: "Web"}, 
  {name: "Donald", course: "Web"} 
])); 
console.log(instructorsWithLongestName([ 
  {name: "Matthew", course: "Web"}, 
  {name: "David", course: "iOS"}, 
  {name: "Domascus", course: "Web"} 
])); 
console.log(instructorsWithLongestName([])); 
console.log(instructorsWithLongestName());

Вариант с reduce, который мне все же не нравится, так как тихо выбирает только одного из нескольких возможных с максимальной длиной имени.

const instructorWithLongestName = function(instructors) { 
  return instructors.reduce((longestName, instructor) =>  
      longestName.name.length > instructor.name.length ? longestName : instructor 
  ); 
}; 
 
console.log(instructorWithLongestName([ 
  {name: "Samuel", course: "iOS"}, 
  {name: "Jeremiah", course: "Web"}, 
  {name: "Ophilia", course: "Web"}, 
  {name: "Donald", course: "Web"} 
])); 
console.log(instructorWithLongestName([ 
  {name: "Matthew", course: "Web"}, 
  {name: "David", course: "iOS"}, 
  {name: "Domascus", course: "Web"} 
]));

Answer 2

Хотя вариант с reduce лучше, всё-таки предложу такой:

function instructorWithLongestName(instructors) { 
  var len = Math.max(...instructors.map(x => x.name.length)) 
  return instructors.find(x => x.name.length === len); 
} 
 
console.log(instructorWithLongestName([ 
  {name: "Samuel",   course: "iOS"}, 
  {name: "Jeremiah", course: "Web"}, 
  {name: "Ophilia",  course: "Web"}, 
  {name: "Donald",   course: "Web"}, 
])); 
 
console.log(instructorWithLongestName([ 
  {name: "Matthew",  course: "Web"}, 
  {name: "David",    course: "iOS"}, 
  {name: "Domascus", course: "Web"}, 
]));

Answer 3

Просто на случай если много с одинаковой длиной

const instructorWithLongestName = function(instructors) { 
  let result = [], 
      len = 0; 
 
  for(let i of instructors){ 
      if (i.name.length > len){ 
          len = i.name.length; 
          result = []; 
      } 
      if (i.name.length === len){ 
          result.push(i); 
      } 
  } 
 
  return result; 
}; 
 
console.log(instructorWithLongestName([ 
  {name: "Samuel", course: "iOS"}, 
  {name: "Jeremiah", course: "Web"}, 
  {name: "Ophilias", course: "Web"}, 
  {name: "Donald", course: "Web"} 
])); 
console.log(instructorWithLongestName([ 
  {name: "Matthew", course: "Web"}, 
  {name: "David", course: "iOS"}, 
  {name: "Domascus", course: "Web"} 
]));

 const instructorWithLongestName = function(instructors) { 
      let maxLength = Math.max(...instructors.map(e => e.name.length)); 
      return instructors.filter(e => e.name.length === maxLength); 
    }; 
 
    console.log(instructorWithLongestName([ 
      {name: "Samuel", course: "iOS"}, 
      {name: "Jeremiah", course: "Web"}, 
      {name: "Ophilias", course: "Web"}, 
      {name: "Donald", course: "Web"} 
    ])); 
    console.log(instructorWithLongestName([ 
      {name: "Matthew", course: "Web"}, 
      {name: "David", course: "iOS"}, 
      {name: "Domascus", course: "Web"} 
    ]));

READ ALSO
Валидность кода JS [закрыт]

Валидность кода JS [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

141
Проблема с парсингом JSON геокодера в JS

Проблема с парсингом JSON геокодера в JS

необходимо получить координаты по адресу через геокодер из JSON, и всё бы хорошо, но парситься полученный JSON не хочет, выдаёт ошибкуПри этом...

113
Найти в URL часть строки

Найти в URL часть строки

Как проверить есть ли в URL часть строкиСтрока полного вида

101