首页 > 解决方案 > 遍历数组和映射

问题描述

“我正在尝试每天获取仪器的总数量。我有一个对象数组,其中包含 instrumentId 和 dailyPrices 作为键。仪器 Id 只是一个键值对。每日价格键是一个对象,键为日期和值作为价格。我想通过计算时间量向对象添加一个键作为totalAmount(该日期的数量*价格)。”

“我曾尝试按仪器 ID 对数组进行分组并获取日期的价格,但它变得复杂了。我还尝试了 underscore.js 中的多种方法。”

let priceData = [{
    instrumentId: 7138,
    dailyPrices: {
      2019 - 02 - 01: 15.89,
      2019 - 02 - 02: 93.990,
      2019 - 02 - 03: 80.90
    }
  },
  {
    instrumentId: 7132,
    dailyPrices: {
      2019 - 02 - 01: 10.89,
      2019 - 02 - 02: 23.990,
      2019 - 02 - 03: 87.90
    }
  }
]

let responseObject = {
  2019 - 02 - 01: {
    7132 - 65: {
      instrumentId: 7132,
      quantity: 10
    },
    7138 - 69: {
      instrumentId: 7138,
      quantity: 18
    }
  },
  2019 - 02 - 03: {
    7132 - 65: {
      instrumentId: 7132,
      quantity: 13
    },
    7138 - 69: {
      instrumentId: 7138,
      quantity: 15
    }
  }

}

我想要这样的输出

let responseObject = {
  2019 - 02 - 01: {
    7132 - 65: {
      instrumentId: 7132,
      quantity: 10,
      totalAmount: 108.9
    },
    7138 - 69: {
      instrumentId: 7138,
      quantity: 18,
      totalAmount: 286.02
    }
  },
  2019 - 02 - 03: {
    7132 - 65: {
      instrumentId: 7132,
      quantity: 13,
      totalAmount: 1142.7
    },
    7138 - 69: {
      instrumentId: 7138,
      quantity: 15,
      totalAmount: 1213.5
    }
  }

}

标签: javascript

解决方案


您可以responseObject通过查找价格来获取和生成想要的属性的条目。

最后重建新对象。

var priceData = [{ instrumentId: 7138, dailyPrices: { '2019-02-01': 15.89, '2019-02-02': 93.990, '2019-02-03': 80.90 } }, { instrumentId: 7132, dailyPrices: { '2019-02-01': 10.89, '2019-02-02': 23.990, '2019-02-03': 87.90 } }],
    responseObject = { '2019-02-01': { '7132-65': { instrumentId: 7132, quantity: 10 }, '7138-69': { instrumentId: 7138, quantity: 18 } }, '2019-02-03': { '7132-65': { instrumentId: 7132, quantity: 13 }, '7138-69': { instrumentId: 7138, quantity: 15 } } },
    result = Object.fromEntries(Object
        .entries(responseObject)
        .map(([k, o]) => [
            k,
            Object.fromEntries(Object
                .entries(o)
                .map(([l, q]) => [
                    l,
                    { ...q, totalAmount: q.quantity * priceData.find(p => q.instrumentId === p.instrumentId).dailyPrices[k] }
                ]))
        ]));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读