【问题标题】:Web API to retrieve data用于检索数据的 Web API
【发布时间】:2018-11-29 18:59:23
【问题描述】:

我正在创建一个 Web API 来使用 express 从模拟数据库中检索数据

我想从数据库模块中检索所有投资组合和头寸的 JSON 列表。是否有可能将数据返回结构化,以便每个投资组合都有一个属性,其中包含与每个投资组合相关的头寸集合?

 const portfolios = [
  {
    id: 1,
    name: "Investor 1"
  },
  {
    id: 2,
    name: "Investor 2"
  },

];

const positions = [
  {
    id: 1,
    portfolioId: 1,
    currency: "GBP",
    value: -2.02,
    date: "2018-06-07"
  },
  {
    id: 2,
    portfolioId: 1,
    currency: "EUR",
    value: 1906302.15,
    date: "2018-06-07"
  },
  {
    id: 3,
    portfolioId: 2,
    currency: "GBP",
    value: 1379804.1,
    date: "2018-06-07"
  },
  {
    id: 4,
    portfolioId: 2,
    currency: "CAD",
    value: 2401938.18,
    date: "2018-06-07"
  }
];

export default { portfolios, positions };

这就是我的路由器里的东西

export default (app) => {
  app.get('/portfolio', (req, res) => {
    res.json({ portfolios });
  });
};

【问题讨论】:

  • portfolios.map (pf => ({...pf, positions: positions.filter (({portfolioId}) => pf.id == portfolioId)})) ?

标签: javascript node.js express


【解决方案1】:

您可以使用mapfilter 的组合。

portfolios.map (pf => ({...pf, positions: positions.filter (({portfolioId}) => pf.id == portfolioId)}))

或者概括这个想法并使用帮助器来加入您的数组。

function join (left, right, {joinKey,foreignKey, idKey='id'}) {
	return left.map (lI => ({...lI,[joinKey]: right.filter (rI => lI[idKey] == rI[foreignKey])}))
}
let joined = join (portfolios, positions, {joinKey: 'positions', foreignKey: 'portfolioId'})
console.log (joined)
<script>

const portfolios = [
  {
    id: 1,
    name: "Investor 1"
  },
  {
    id: 2,
    name: "Investor 2"
  },

];

const positions = [
  {
    id: 1,
    portfolioId: 1,
    currency: "GBP",
    value: -2.02,
    date: "2018-06-07"
  },
  {
    id: 2,
    portfolioId: 1,
    currency: "EUR",
    value: 1906302.15,
    date: "2018-06-07"
  },
  {
    id: 3,
    portfolioId: 2,
    currency: "GBP",
    value: 1379804.1,
    date: "2018-06-07"
  },
  {
    id: 4,
    portfolioId: 2,
    currency: "CAD",
    value: 2401938.18,
    date: "2018-06-07"
  }
];

</script>

【讨论】:

    【解决方案2】:

    您应该查看lodash。它有很多有用的函数,比如 filter 来迭代数据。

    这应该可行:

    export default (app) => {
        app.get('/portfolio', (req, res) => {
            res.json(_.map(portfolios, portfolio => {
                return {
                    id: portfolio.id,
                    name: portfolio.name,
                    positions: _.filter(positions, position => position.portfolioId == portfolio.id)
                }
            }));
        });
    };
    

    请注意,我不这样做 portfolio.positions = _.filter(...) 否则 portfolios 内的引用将被修改。如果您的投资组合变得更复杂,您可以探索_.clone()

    【讨论】:

      猜你喜欢
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      • 1970-01-01
      • 1970-01-01
      • 2022-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多