如何按给定 ID 打印名称

How to print a name by a given ID

提问人:Alvaro Vasquez 提问时间:6/28/2023 最后编辑:SamathingamajigAlvaro Vasquez 更新时间:6/28/2023 访问量:101

问:

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()。

数组 数组列出 JavaScript 对象

评论

2赞 evolutionxbox 6/28/2023
因为是一个数组,你不能使用 .使用另一个数组方法,例如确保 在数组中。idb.id === 56includesid
0赞 Mister Jojo 6/28/2023
const peopleFinder = id => people.find(e=>e.id.includes(id))?.name;会没事的...(?)
0赞 Alexander Nenashev 6/28/2023
检查我的解决方案,似乎更快Array::reduce()
1赞 Alexander Nenashev 6/28/2023
它允许找到几个名字吗?例如,ID 34 有 2 个名称

答:

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;
}, []));

还有一个基准:

enter image description here

<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 );