Javascript 将模板字符串传递到array.filter操作

Javascript 将模板字符串传递到array.filter操作,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我有一些代码比较两个数组并过滤数据,如下所示: const recordsToUpdate = await sourceArr.filter(e => targetArr.find(obj => obj.id === e.id_number) !== undefined); 我想做的是找到一种方法,为这里匹配的属性传入动态变量,这样我就可以重用这段代码 我可以用反勾号和模板字符串或者其他方式来完成吗 我试过这个,但没用: const recordsToUpdate = await

我有一些代码比较两个数组并过滤数据,如下所示:

const recordsToUpdate = await sourceArr.filter(e => targetArr.find(obj => obj.id === e.id_number) !== undefined);
我想做的是找到一种方法,为这里匹配的属性传入动态变量,这样我就可以重用这段代码

我可以用反勾号和模板字符串或者其他方式来完成吗

我试过这个,但没用:

const recordsToUpdate = await sourceArr.filter(`e => targetArr.find(obj => obj.${targetProp} === e.${sourceProp}) !== undefined`);

是否有一些语法允许我执行此操作?

您可以通过以下语法访问对象属性:

const recordsToUpdate = await sourceArr.filter(e => targetArr.find(obj => obj[targetProp] === e[sourceProp]) !== undefined);

你需要这样做

const findRecords=(键1,键2)=>{
//无需使用等待
返回sourceArr.filter(e=>targetar.find(obj=>obj[key1]==e[key2])!==undefined);

}
除了在括号内使用
targetProp
sourceProp
符号外,还应将
targetar
转换为a,以将
filter()
方法的时间复杂度从O(m*n)降低到O(m+n)。您可以使用curried函数和闭包来执行此操作,而无需在全局范围中创建

const filterBy = (targetArr, targetProp) => {
  const targetSet = new Set(targetArr.map(obj => obj[targetProp]));

  return (sourceArr, sourceProp) => (
    soureArr.filter(obj => targetSet.has(obj[sourceProp]))
  );
};

// example usage
const filterByTargetProp = filterBy(targetArr, targetProp);
// filterByTargetProp() is a reusable function
const recordsToUpdate = filterByTargetProp(sourceArr, sourceKey);

只需使用
obj[targetProp]
e[sourceProp]
即可。您是否尝试过obj[targetProp],另一种访问对象属性的方法。如果您将
targetar
转换为每个
targetProp
集合,则
过滤器()
也可以变成O(n)而不是O(n^2)过滤器()
是同步的,除非您的
sourceArr
不是一个JavaScript
数组
,因此无需等待
使用问题中的名称
targetProp
sourceProp
更具描述性。