Как напечатать имя по заданному ID

var people = [
    {name: 'John', id: [34, 44, 77]},
    {name: 'Jose', id: [43, 54, 65]},
    {name: 'Hanna', id: [56, 34, 98]}
];

var peopleFinder = people.filter(function(b){
    return b.id === 56;
}).map(function(n2){
    return n2.name;
})
console.info(peopleFinder);

Как напечатать имя из массива объектов по заданному ID. Это должно быть решено без использования каких-либо циклов. Разрешено использовать только методы массива: .filter(), .map(), .reduce() и .find().

Поскольку id — это массив, вы не можете использовать b.id === 56. Используйте другой метод массива, например includes, чтобы убедиться, что id находится в массиве.

evolutionxbox 28.06.2023 15:55
const peopleFinder = id => people.find(e=>e.id.includes(id))?.name; все будет хорошо...(?)
Mister Jojo 28.06.2023 16:13

проверьте мое Array::reduce() решение, кажется быстрее

Alexander Nenashev 28.06.2023 16:40

это позволяет найти несколько имен? например id 34 имеет 2 имени

Alexander Nenashev 28.06.2023 16:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
56
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Однако, поскольку свойство id в каждом объекте является массивом, вам необходимо использовать метод .includes(), чтобы проверить, существует ли данный идентификатор в массиве. Пожалуйста, проверьте приведенный ниже код и попробуйте, я внес некоторые изменения:

var people = [
  {name: 'John', id: [34, 44, 77]},
  {name: 'Jose', id: [43, 54, 65]},
  {name: 'Hanna', id: [56, 34, 98]}
];

var peopleFinder = people.filter(function(person) {
  return person.id.includes(56);
}).map(function(person) {
  return person.name;
});

console.info(peopleFinder);

В этом коде метод filter() используется для поиска объектов с идентификатором 56 в их массиве идентификаторов. Метод includes() используется для выполнения проверки. Затем метод map() используется для извлечения свойства имени из отфильтрованных объектов.

Надеюсь, это поможет!

Ответы (даже те, которые работают) не должны быть просто кодом. Вы должны объяснить, в чем была проблема и как ваш код решает ее.

Scott Marcus 28.06.2023 15:55

@ScottMarcus отредактировал. Спасибо

Kedar Thakkar 28.06.2023 15:57

Ты почти там. Просто убедитесь, что вы проверяете, включает ли массив id идентификатор, который вы ищете, и не сравнивайте по значению:

var people = [
  {name: "John", id: [34, 44, 77]},
  {name: "Jose", id: [43, 54, 65]},
  {name: "Hanna", id: [56, 34, 98]}
];

const id = 56;

const name = people.filter(p => p.id.includes(id)).map(p => p.name);
console.info(name);

Ну, сначала нам нужно отфильтровать те, которые не имеют идентификатора, который мы ищем. Для этого мы используем filter().

var peopleFinder = people
  .filter(function(person) {
    return person.id.includes(idToFind);
  })

Если говорить более подробно, функция filter фильтрует массив, чтобы включить только те элементы, которые соответствуют критериям.

После этого нам нужно сопоставить имя нашего пользователя, поэтому мы используем функцию map().

  .map(function(person) {
    return person.name;
  });

Затем, объединив их вместе, мы должны получить имя человека с нужным нам идентификатором.

var peopleFinder = people
  .filter(function(person) {
    return person.id.includes(idToFind);
  })
  .map(function(person) {
    return person.name;
  });

Array::reduce() компактная версия:

const people = [
  {name: "John", id: [34, 44, 77]},
  {name: "Jose", id: [43, 54, 65]},
  {name: "Hanna", id: [56, 34, 98]}
];
const idToFind = 34;
console.info(people.reduce((result, {name, id}) => {
  id.includes(idToFind) && result.push(name);
  return result;
}, []));

И ориентир:

<script benchmark data-count = "1">

    const chunk = [
        { name: 'John', id: [34, 44, 77] },
        { name: 'Jose', id: [43, 54, 65] },
        { name: 'Hanna', id: [56, 34, 98] }
    ];

    let people = [];

    let count = 5000000;
    while (count--) {
        people.push(...chunk);
    }

    const idToFind = 34;

    // @benchmark Kedar's solution
    people.filter(function (person) {
        return person.id.includes(idToFind);
    }).map(function (person) {
        return person.name;
    });


    // @benchmark Alexander's solution
    people.reduce((result, { name, id }) => {
        id.includes(idToFind) && result.push(name);
        return result;
    }, []);


</script>
<script src = "https://cdn.jsdelivr.net/gh/silentmantra/benchmark/loader.js"></script>

Просто для удовольствия, не пытайтесь воспроизвести дома версию с регулярным выражением :)

var people = [
  {name: 'John', id: [34, 44, 77]},
  {name: 'Jose', id: [43, 54, 65]},
  {name: 'Hanna', id: [56, 34, 98]}
];

const id = 34;
const regex = new RegExp(`(?<=name":")[^"]+(? = ","id":\\[[\\d,]*(?<=\\D)${id})`, 'g');
console.info(JSON.stringify(people).match(regex))
{ id.includes(idToFind) && result.push(name); return result; } может быть id.includes(idToFind) ? [...result, name] : result
JollyJoker 28.06.2023 17:35

@JollyJoker может быть, но производительность значительно пострадает из-за копирования массива

Alexander Nenashev 28.06.2023 17:42

Вы можете использовать метод Array#find следующим образом:

const 
      people = [ {name: 'John', id: [34, 44, 77]}, {name: 'Jose', id: [43, 54, 65]}, {name: 'Hanna', id: [56, 34, 98]} ],
      
      id = 56,
      
      person = people.find(p => p.id.includes(id))?.name || 'not found';
      
console.info( person );

Другие вопросы по теме