Javascript Typescript:通过所述数组的子集过滤数组并返回匹配的ID

Javascript Typescript:通过所述数组的子集过滤数组并返回匹配的ID,javascript,arrays,typescript,lodash,Javascript,Arrays,Typescript,Lodash,假设您有两个阵列: Animals[]; SelectedAnimals[]; 当用户搜索新动物时,我们必须确保选中的动物仍处于选中状态,并且如果新动物结果不匹配,我们还必须确保过滤掉以前选中的动物 我的解决方案确实有效,但我担心在单个阵列上给定一个映射、过滤器、过滤器的时间复杂性/黑客性。是否有更好的方法使用JS/Lodash数组函数来实现我的目标,即使用所述数组的子集过滤数组(并避免未定义的条目) new V.Ajax().Post(window.animals.url.searchA

假设您有两个阵列:

Animals[];

SelectedAnimals[];
当用户搜索新动物时,我们必须确保选中的动物仍处于选中状态,并且如果新动物结果不匹配,我们还必须确保过滤掉以前选中的动物

我的解决方案确实有效,但我担心在单个阵列上给定一个映射、过滤器、过滤器的时间复杂性/黑客性。是否有更好的方法使用JS/Lodash数组函数来实现我的目标,即使用所述数组的子集过滤数组(并避免未定义的条目)

new V.Ajax().Post(window.animals.url.searchAnimals,searchParams).done((响应:V.JsonResult)=>{
if(response.success){
将newAnimals=response.data.Results作为动物[];

让selectedAnimals=newAnimals=[]?[]:this.state.selectedAnimals.map(x=>filter(newAnimals,(animal)=>animal.AnimalID==x.AnimalID)).filter(item=>typeof item==='number')
我认为
.isNumber
可能正是您所需要的!如果新动物是空的或任何动物是无效的,下面的代码应该有效

const newAnimalIds = _.map(newAnimals,
      a => a && _.isNumber(a) ? a.AnimalId : null);

const selectedAnimals = _.filter(this.state.selectedAnimals, 
      x => _.includes(newAnimalIds, x.AnimalId));

耶·洛达斯:)

我们正在讨论的阵列有多长?@Markus让我们说1000 maxExcellent!很乐意帮忙