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
更具描述性。