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().
const peopleFinder = id => people.find(e=>e.id.includes(id))?.name; все будет хорошо...(?)
проверьте мое Array::reduce() решение, кажется быстрее
это позволяет найти несколько имен? например id 34 имеет 2 имени



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Однако, поскольку свойство 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() используется для извлечения свойства имени из отфильтрованных объектов.
Надеюсь, это поможет!
Ответы (даже те, которые работают) не должны быть просто кодом. Вы должны объяснить, в чем была проблема и как ваш код решает ее.
@ScottMarcus отредактировал. Спасибо
Ты почти там. Просто убедитесь, что вы проверяете, включает ли массив 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 может быть, но производительность значительно пострадает из-за копирования массива
Вы можете использовать метод 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 );
Поскольку
id— это массив, вы не можете использоватьb.id === 56. Используйте другой метод массива, напримерincludes, чтобы убедиться, чтоidнаходится в массиве.