Javascript 如何基于另一个数组对对象数组进行筛选和排序

Javascript 如何基于另一个数组对对象数组进行筛选和排序,javascript,arrays,Javascript,Arrays,我有一个用户数组,需要根据另一个数组“filter”对其进行筛选和排序。阅读下面的代码可以看到预期的结果 const users = [ { key: 'abc', name: 'Anna', age: 22, gender: 'F' }, { key: 'def', name: 'John', age: 25, gender: 'M' }, { key: 'ghi', name: 'Mary', age: 27, gender: 'F' }, { key: 'jkl', n

我有一个用户数组,需要根据另一个数组“filter”对其进行筛选和排序。阅读下面的代码可以看到预期的结果

const users = [ 
  { key: 'abc', name: 'Anna', age: 22, gender: 'F' }, 
  { key: 'def', name: 'John', age: 25, gender: 'M' },
  { key: 'ghi', name: 'Mary', age: 27, gender: 'F' },
  { key: 'jkl', name: 'Joe',  age: 30, gender: 'M' } 
] 

const filter = [ 
  { key: 'jkl' },
  { key: 'def' },
  { key: 'abc' },
] 

// Here is the expected result:
const expected_result = [ 
  { key: 'jkl', name: 'Joe',  age: 30, gender: 'M' },
  { key: 'def', name: 'John', age: 25, gender: 'M' },
  { key: 'abc', name: 'Anna', age: 22, gender: 'F' }
] 

请考虑“KEY”属性是唯一的。有人知道我怎么做吗?如果您也能解释一下代码背后的逻辑,我将不胜感激。我是一个乞丐,我正在努力学习如何使用JavaScript函数来实现这一点


提前谢谢

一个非常有效的解决方案是将
过滤器
数组转换为映射,然后使用它过滤用户:
const users=[
{键:'abc',名字:'Anna',年龄:22岁,性别:'F'},
{key:'def',name:'John',年龄:25岁,性别:'M'},
{键:'ghi',名字:'Mary',年龄:27岁,性别:'F'},
{key:'jkl',name:'Joe',年龄:30岁,性别:'M'}
] 
常量筛选器=[
{key:'jkl'},
{key:'def'},
{key:'abc'},
] 
const keys=Object.values(filter).reduce((acc,cur)=>{acc[cur.key]=true;返回acc;},{});
const result=users.filter(user=>keys[user.key]);

控制台日志(结果)
一个非常有效的解决方案是将
过滤器
数组转换为映射,然后使用它过滤用户:
const users=[
{键:'abc',名字:'Anna',年龄:22岁,性别:'F'},
{key:'def',name:'John',年龄:25岁,性别:'M'},
{键:'ghi',名字:'Mary',年龄:27岁,性别:'F'},
{key:'jkl',name:'Joe',年龄:30岁,性别:'M'}
] 
常量筛选器=[
{key:'jkl'},
{key:'def'},
{key:'abc'},
] 
const keys=Object.values(filter).reduce((acc,cur)=>{acc[cur.key]=true;返回acc;},{});
const result=users.filter(user=>keys[user.key]);
控制台日志(结果)
const users=[
{键:'abc',名字:'Anna',年龄:22岁,性别:'F'},
{key:'def',name:'John',年龄:25岁,性别:'M'},
{键:'ghi',名字:'Mary',年龄:27岁,性别:'F'},
{key:'jkl',name:'Joe',年龄:30岁,性别:'M'}
] 
常量筛选器=[
{key:'jkl'},
{key:'def'},
{key:'abc'},
] 
函数排序(用户、筛选器){
var结果=[];
filter.forEach(obj=>{
user.forEach(obj2=>{
if(obj.key==obj2.key){
结果:推送(obj2);
}
})
})
返回结果;
}
console.log(排序(用户、过滤器))
const users=[
{键:'abc',名字:'Anna',年龄:22岁,性别:'F'},
{key:'def',name:'John',年龄:25岁,性别:'M'},
{键:'ghi',名字:'Mary',年龄:27岁,性别:'F'},
{key:'jkl',name:'Joe',年龄:30岁,性别:'M'}
] 
常量筛选器=[
{key:'jkl'},
{key:'def'},
{key:'abc'},
] 
函数排序(用户、筛选器){
var结果=[];
filter.forEach(obj=>{
user.forEach(obj2=>{
if(obj.key==obj2.key){
结果:推送(obj2);
}
})
})
返回结果;
}

log(sort(users,filter))
您可以将第一个用户数组转换为一个。贴图类似于对象,但是它有一些(我在这里使用贴图,因为与对象相比,从数组构造贴图更容易)

地图将具有以下形状:

Map {
  "abc": { key: 'abc', name: 'Anna', age: 22, gender: 'F' }, 
  "def": { key: 'def', name: 'John', age: 25, gender: 'M' },
  "ghi": { key: 'ghi', name: 'Mary', age: 27, gender: 'F' },
  "jkl": { key: 'jkl', name: 'Joe',  age: 30, gender: 'M' } 
}
在下面的代码中,上述映射存储在名为
lut
(查找表的缩写)的变量中。执行
lut.get(“def”)
将返回存储在键
“def”
处的对象,在这种情况下,该对象是:

{ key: 'def', name: 'John', age: 25, gender: 'M' }
JavaScript引擎已经优化了这个查找,使其具有难以置信的效率,因此创建这样一个映射可以帮助提高总体可伸缩性,这意味着如果您有许多用户,它将是高效的

由于顺序在输出中很重要,因此可以在
过滤器
数组(确定顺序)上使用
.map()
将每个具有name属性的对象转换为我们构建的映射中的对象。要执行“转换”,您可以返回所需的新对象,您可以使用
.get(o.key)
从地图中获取该对象

请参见下面的工作示例:

const users=[{key:'abc',name:'Anna',年龄22岁,性别:'F'},{key:'def',name:'John',年龄25岁,性别:'M'},{key:'ghi',name:'Mary',年龄27岁,性别:'F'},{key:'jkl name:'Joe',年龄30岁,性别:'M'};
常量过滤器=[{key:'jkl'},{key:'def'},{key:'abc'}];
const expected_result=[{key:'jkl',name:'Joe',年龄:30,性别:M'},{key:'def',name:'John',年龄:25,性别:M'},{key:'abc',name:'Anna',年龄:22,性别:F'}];
constlut=newmap(users.Map(o=>[o.key,o]);
const result=filter.map(f=>lut.get(f.key));

控制台日志(结果)您可以将第一个用户数组转换为一个。贴图类似于对象,但是它有一些(我在这里使用贴图,因为与对象相比,从数组构造贴图更容易)

地图将具有以下形状:

Map {
  "abc": { key: 'abc', name: 'Anna', age: 22, gender: 'F' }, 
  "def": { key: 'def', name: 'John', age: 25, gender: 'M' },
  "ghi": { key: 'ghi', name: 'Mary', age: 27, gender: 'F' },
  "jkl": { key: 'jkl', name: 'Joe',  age: 30, gender: 'M' } 
}
在下面的代码中,上述映射存储在名为
lut
(查找表的缩写)的变量中。执行
lut.get(“def”)
将返回存储在键
“def”
处的对象,在这种情况下,该对象是:

{ key: 'def', name: 'John', age: 25, gender: 'M' }
JavaScript引擎已经优化了这个查找,使其具有难以置信的效率,因此创建这样一个映射可以帮助提高总体可伸缩性,这意味着如果您有许多用户,它将是高效的

由于顺序在输出中很重要,因此可以在
过滤器
数组(确定顺序)上使用
.map()
将每个具有name属性的对象转换为我们构建的映射中的对象。要执行“转换”,您可以返回所需的新对象,您可以使用
.get(o.key)
从地图中获取该对象

请参见下面的工作示例:

const users=[{key:'abc',name:'Anna',年龄22岁,性别:'F'},{key:'def',name:'John',年龄25岁,性别:'M'},{key:'ghi',name:'Mary',年龄27岁,性别:'F'},{key:'jkl name:'Joe',年龄30岁,性别:'M'};
常量过滤器=[{key:'jkl'},{key:'def'},{key:'abc'}];
预期常数