使用Javascript查找所有具有匹配Id的对象

15
我试图从我的学生数组中获取所有具有匹配ID的对象,并从它们中获取其他属性值...
例如,我的数组看起来像这样:
const students = [
    {id: 1, name: 'Cal', location: 'McHale' },
    {id: 2, name: 'Courtney', location: 'Sydney Hall' }, 
    {id: 1, name: 'Cal', location: 'Syndey hall' }
]
所以,我期望的输出将获取所有id为1的实例。
{id: 1, name: 'Cal', location: 'McHale' },
{id: 1, name: 'Cal', location: 'Syndey hall' }

我最终想要删除重复的名称,并像这样显示在列表中...(但那是以后的事情。现在我只想获取匹配的对象)。

Id: 1    Name: Cal    Location: McHale
                                Syndey Hall

我已经尝试过:

const result = _.find(students, {student_id: studentId});

但是似乎行不通,它只会返回具有该ID的对象之一..

{id: 1, name: 'Cal', location: 'McHale' },

我该如何让这个工作起来?


2
https://lodash.com/docs#filter - 话虽如此,鉴于你要过滤的是一个数组而不是对象,在这种情况下你甚至不需要使用 Lodash。你可以直接使用内置的 Array.prototype.filter() 函数。 - Joe Clay
1
@JoeClay 哦,lodash的筛选器似乎更容易使用。使用Array.prototype.filter() students.filter(x => x.student_id === studentId); 有什么好处吗? - Modelesq
@Modelesq 内置的可能更快,因为 lowdash 的执行过程涉及了更多的操作:https://github.com/lodash/lodash/blob/4.13.1/lodash.js#L8458 - JustGage
1
@JustGage,谢谢你的回复:D - Modelesq
1
没错,@JustGage是对的 - 一般来说,我会尽可能地支持使用内置方法而不是Lodash,因为它们往往是用本机代码实现而不是JavaScript,这通常会更快。话虽如此,除非这发生在您代码中真正性能关键的部分,否则它可能不会产生显着的差异! - Joe Clay
这个回答解决了你的问题吗?如何返回一个对象数组中所有匹配的元素? - Heretic Monkey
4个回答

26

我会研究一下filter函数。它是内置于JavaScript中的。

以下是它的工作方式示例。你只需要找到一种方法来编写一个函数,以判断它是否具有正确的ID。

function isBigEnough(value) {
  return value >= 10;
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
// filtered is [12, 130, 44]

9
如果您查看_.find的文档,它会说明:

迭代集合的元素,返回第一个满足条件的元素。


您应该使用_.filter方法来实现您想要的功能。

迭代集合的元素,返回所有满足条件的元素数组

类似于以下代码:

const result = _.filter(students, {student_id: studentId});

是的,我错过了“返回第一个元素部分”。我还没有喝上早晨的咖啡,谢谢! - Modelesq

3
const result = students.filter(e => e.id === 1);

1

无论有多少其他元素与您的条件匹配,find方法始终返回第一个匹配的元素。

如果要提取所有匹配的元素,则需要使用.filter方法。

实现方式相同,但结果从对象(.find())变为数组(.filter())


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接