提问人:Alvaro Vasquez 提问时间:6/28/2023 最后编辑:SamathingamajigAlvaro Vasquez 更新时间:6/28/2023 访问量:101
如何按给定 ID 打印名称
How to print a name by a given 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.log(peopleFinder);
如何通过给定的 ID 从对象数组中打印名称。这必须在不使用任何类型的循环的情况下解决。只允许使用数组方法:.filter()、.map()、.reduce() 和 .find()。
答:
3赞
Kedar
6/28/2023
#1
但是,由于每个对象中的 id 属性都是一个数组,因此您需要使用该方法来检查数组中是否存在给定的 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.log(peopleFinder);
在此代码中,该方法用于查找其 id 数组中 ID 为 56 的对象。该方法用于执行检查。然后,该方法用于从筛选的对象中提取 name 属性。filter()
includes()
map()
希望这会有所帮助!
评论
1赞
Scott Marcus
6/28/2023
答案(即使是那些有效的答案)不应该只是代码。你应该解释问题是什么,以及你的代码是如何解决的。
0赞
Kedar
6/28/2023
@ScottMarcus编辑。谢谢
1赞
Behemoth
6/28/2023
#2
你快到了。只要确保检查数组是否包含
您要查找的 id,并且不要按值进行比较: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.log(name);
0赞
Noubar K.
6/28/2023
#3
好吧,首先我们需要过滤掉那些没有我们正在搜索的 id 的。为此,我们用户.filter()
var peopleFinder = people
.filter(function(person) {
return person.id.includes(idToFind);
})
更详细地说,filter 函数的作用是筛选数组以仅包含与条件匹配的项。
之后,我们必须映射用户名,因此我们使用该函数。map()
.map(function(person) {
return person.name;
});
然后,通过将它们放在一起,我们应该获得具有我们需要的 ID 的人的姓名。
var peopleFinder = people
.filter(function(person) {
return person.id.includes(idToFind);
})
.map(function(person) {
return person.name;
});
0赞
Alexander Nenashev
6/28/2023
#4
紧凑型: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.log(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.log(JSON.stringify(people).match(regex))
评论
0赞
JollyJoker
6/28/2023
{ id.includes(idToFind) && result.push(name); return result; }
可能是id.includes(idToFind) ? [...result, name] : result
0赞
Alexander Nenashev
6/28/2023
@JollyJoker可能是,但由于阵列复制,性能将受到严重影响
0赞
Behemoth
6/29/2023
我喜欢你对性能改进的追求,但我认为,有时最好编写每个人都可以轻松理解的简单代码,而不是为长度为 3 的数组过于复杂。
0赞
Alexander Nenashev
6/29/2023
@Behemoth应该比 es5 做得更好。Legacy JS 是有问题的。程序员应该学习现代版本的语言
0赞
Alexander Nenashev
6/29/2023
@Behemoth现在使用 var 是一种犯罪行为
0赞
PeterKA
6/28/2023
#5
您可以按如下方式使用方法: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.log( person );
评论
id
b.id === 56
includes
id
const peopleFinder = id => people.find(e=>e.id.includes(id))?.name;
会没事的...(?)Array::reduce()