Javascript 基于对象数组筛选对象数组

Javascript 基于对象数组筛选对象数组,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,这是我的数据 [{name:'james',grade:'A'}, {name:'john',grade:'B'}, {name:'iris',,grade:'A'}, {name:'ivan',,grade:'C'}] 我想保留有A级和C级的对象,很容易我可以像这样做过滤器 person.filter(obj=>obj.grade=='A'| | obj.grade=='C') 但现在我有了一个对象数组 [{grade:'A'},{grade:'C'}] 有什么线索我现在可以做过滤吗?我需要

这是我的数据

[{name:'james',grade:'A'},
{name:'john',grade:'B'},
{name:'iris',,grade:'A'},
{name:'ivan',,grade:'C'}]
我想保留有A级和C级的对象,很容易我可以像这样做过滤器

person.filter(obj=>obj.grade=='A'| | obj.grade=='C')

但现在我有了一个对象数组

[{grade:'A'},{grade:'C'}]

有什么线索我现在可以做过滤吗?我需要嵌套循环吗?

使用:

let person=[{name:'james',grade:'A'},
{姓名:'john',年级:'B'},
{姓名:'iris',成绩:'A'},
{姓名:'ivan',年级:'C'}];
让谓词=[{grade:'A'},{grade:'C'}];
让result=person.filter(obj=>predicate.some(p=>p.grade==obj.grade))
log('result:',result)
使用下划线库 例如


具有等级
A
C
的对象应过滤为(经典js语法)


如果你有很多分数要检查(我不知道你喜欢所有的;))。您可以首先将数组转换为
Set

const grades = new Set([{grade:'A'},{grade:'C'}].map(({grade}) => grade))

const persons = [{name:'james',grade:'A'},
  {name:'john',grade:'B'},
  {name:'iris',grade:'A'},
  {name:'ivan',grade:'C'}]
然后使用

您可以对谓词使用a,并相应地进行筛选

let person=[{name:'james',grade:'A'},{name:'john',grade:'B'},{name:'iris',grade:'A'},{name:'ivan',grade:'C'}],
谓词=[{grade:'A'},{grade:'C'}],
result=person.filter((s=>p=>s.has(p.grade))(新集合(predicate.map(p=>p.grade)));
console.log(结果)


。作为控制台包装器{max height:100%!important;top:0;}
您的意思是您有一个数组?@AndrewLi no,array of object您能给出一个您正在处理的数据示例吗?你的问题是unclear@AndrewLi“C”和“A”不是存储在任何变量中的字符串或值,而是对象数组。您当前的代码有什么问题?你的问题措辞暗示它应该有效。你的谓词错了,它不包括名字。OP的输出很奇怪,因为它出于某种原因丢弃了名称,只保留了等级。不,
谓词
是OP的“但现在我有了一个对象数组”
person
是第一个包含名称的数组。编辑以澄清。哦,该死,我想我刚刚理解了这个问题。我认为他的过滤器是错误的,但实际上他想重新应用第二个过滤器。很抱歉,我可以看到你在那里从马车上摔下来了……:)虽然我不理解你代码的第二部分,但有些已经足够做这项工作了。OP的问题是什么?你的代码是如何修复的?@JeremyThille我想使用库可以让代码更干净我觉得这完全是可选的我很抱歉,我误解了OP的问题。我否决了你的答案:)这个答案怎么了?-))缺少分号?-))我犯了同样的错误,我误解了OP的问题。他的第一个过滤器可以工作,但现在他想基于谓词
[{grade:'a'},{grade:'C'}]
应用第二个过滤器。他的问题确实很容易引起误解。(我没有投反对票)我真的不在乎投反对票,但我真的不明白他想要什么-)嗯,你不会来帮助Stackoverflow上的人投反对票,是吗?:)当然,但“sapere aude”比这类情况更重要-)当然,这可以更通用,所以如果用户还想添加一个过滤器项
{name:'john'}
,您就不必重写它:p(尽管答案不错)
var a = [
  {name:'james',grade:'A'},
  {name:'john',grade:'B'},
  {name:'iris',grade:'A'},
  {name:'ivan',grade:'C'}
];

a.filter(function(e) { 
  return (e.grade == 'A') || (e.grade == 'C');
}); 
const grades = new Set([{grade:'A'},{grade:'C'}].map(({grade}) => grade))

const persons = [{name:'james',grade:'A'},
  {name:'john',grade:'B'},
  {name:'iris',grade:'A'},
  {name:'ivan',grade:'C'}]
const filtered = persons.filter(({grade}) => grades.has(grade))