Передача строк шаблона в операцию array.filter - PullRequest
0 голосов
/ 24 января 2020

У меня есть некоторый код, который сравнивает два массива и фильтрует данные, который выглядит следующим образом:

const recordsToUpdate = await sourceArr.filter(e => targetArr.find(obj => obj.id === e.id_number) !== undefined);

Что я хотел бы сделать, так это найти способ передачи динамических c переменных для свойства сопоставляются здесь, поэтому я могу повторно использовать этот код.

Могу ли я сделать это с помощью обратных галочек и строк шаблона - или каким-либо другим способом?

Я попробовал это, и это не сработало:

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

Существует ли какой-либо синтаксис, который позволит мне это сделать?

Ответы [ 3 ]

1 голос
/ 24 января 2020

Вы можете получить доступ к свойству объекта с помощью следующих синтаксисов:

const recordsToUpdate = await sourceArr.filter(e => targetArr.find(obj => obj[targetProp] === e[sourceProp]) !== undefined);
0 голосов
/ 24 января 2020

В дополнение к использованию targetProp и sourceProp в скобочных обозначениях вы должны преобразовать targetArr в Set, чтобы уменьшить временную сложность метода filter() из O ( от m * n) до O (m + n). Вы можете использовать карри функцию и замыкание, чтобы сделать это, не создавая Set в глобальной области видимости:

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);
0 голосов
/ 24 января 2020

Вам нужно сделать вот так

const findRecords = (key1, key2) => {
  // No need to use await
  return sourceArr.filter(e => targetArr.find(obj => obj[key1] === e[key2]) !== undefined);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...