首页 > 解决方案 > 导入提供 JSON 数据的模块时如何传递参数?

问题描述

如果我有类似的东西,

// resources.js
import DB from 'some/massive.json';

export const RESOURCES = (() => {
  const {
    dataA,
    dataB
  } = DB;

  return [
    dataA,
    dataB
  ];
})

我像导入它一样

// someOtherFile.js
import { RESOURCES } from 'path/to/resources.js'

如何导入RESOURCES,传入参数,以限制接收的数据?RESOURCES大小可能是 MB,并且对于每个运行的测试,我不需要所有这些,我只需要针对特定​​测试的特定资源。

就像是,

import DB from 'some/massive.json';

export const RESOURCES = (dataToExclude = null, () => {
  const {
    dataA,
    dataB
  } = DB;

  const dataArray = [
    dataA, dataB
  ].flatMap(data => {
    // Process
    return data;
  })

  // dataArray will look something like,
  // [ { dataName: 'NameA', ...props }, { dataName: 'NameB', ...props } ]
  if (dataToExclude) {
    const indexToSplice = dataArray.findIndex(({ dataName }) => dataName === dataToExclude)
    dataArray.splice(indexToSplice, 1)
  }

  return dataToExclude;
});

标签: javascript

解决方案


RESOURCES 的主体不是问题,我只是想看看是否可以传入参数

已经RESOURCES是一个函数,无需将其包装在另一个函数中。(也没有理由将其包裹在括号中,尽管它们是无害的。)将您希望它具有的过滤条件传递给它:

export const RESOURCES = (filteringCriteria) => {
  const {
    dataA,
    dataB
  } = DB;

  // ...apply filtering here...

  return [
    dataA,
    dataB
  ];
};

...然后在导入后调用它:

const data = RESOURCES({/*...filtering criteria...*/});

但是,如果您想将其包装在另一个函数中,是的,您可以这样做并让内部函数关闭过滤条件:

export const RESOURCES = (filteringCriteria) => {
  return () => {
      const {
        dataA,
        dataB
      } = DB;

      // ...apply filtering here...

      return [
        dataA,
        dataB
      ];
  };
};

然后你会调用它一次来建立过滤条件,并调用它的结果来实际获取数据:

const dataSupplier = RESOURCES({/*...filtering criteria...*/});
// ...
const data = dataSupplier();

推荐阅读