动态调用具有多个参数的函数

时间:2018-01-07 22:00:20

标签: javascript arrays

我正在尝试在动态数量的数组中找到相似的项目。例如,我可能有2或3个数组,其中包含数据,并希望找到所有数据之间存在的项目。

在我得到这个“工作”的那一刻,但是真正难看的代码不能超过3个项目。 GDAX,PLNX等都是bool,我可以告诉我这个选项是否被选中。

intersectionBy是一个lodash辅助函数,其中提供了更多信息https://lodash.com/docs/4.17.4#intersectionBy

  let similarItems = [];
  similarItems = GDAX && PLNX && BTRX ? _.intersectionBy(data.BTRX, data.PLNX, data.GDAX, 'pair') : similarItems;
  similarItems = GDAX && PLNX && !BTRX ? _.intersectionBy(data.PLNX, data.GDAX, 'pair') : similarItems;
  similarItems = GDAX && !PLNX && BTRX ? _.intersectionBy(data.BTRX, data.GDAX, 'pair') : similarItems;
  similarItems = !GDAX && PLNX && BTRX ? _.intersectionBy(data.BTRX, data.PLNX, 'pair') : similarItems;

2 个答案:

答案 0 :(得分:2)

这应该做的工作

const input = ['GDAX', 'PLNX', 'BTRX']; // here you pass the strings that are given

const result = _.intersectionBy.apply(_, input.map(name => data[name]).concat(['pair']));

输入也可能以某种方式自动化,例如为每个名称提供true / false值的对象,所以

const inputObject = { GDAX: true, PLNX: false, BTRX: true };

const names = ['GDAX', 'PLNX', 'BTRX'].filter(name => inputObject[name]);

const result = _.intersectionBy.apply(_, names.map(name => data[name]).concat(['pair']));

答案 1 :(得分:2)

为了便于阅读和易于维护,我将根据您的布尔标志显式构建选择:

let selection = [];
if (GDAX) selection.push(data.GDAX);
if (PLNX) selection.push(data.PLNX);
if (BTRX) selection.push(data.BTRX);
const result = _.intersectionBy(...selection, 'pair');