Как вернуть сумму дублированных значений в массиве объектов плюс вернуть значения не дублированных значений? - PullRequest
0 голосов
/ 15 апреля 2020

Первый вопрос здесь, поэтому, пожалуйста, не стесняйтесь указывать, что я должен делать по-другому, или если есть другие потоки, на которые я должен ссылаться.

У меня есть массив объектов, которые выглядят так:

const fetchResults = [ {
  date: '03/20/2020', symbol: 'TLTE', quantity: 100, amount: 3570,
}, {
  date: '03/20/2020', symbol: 'GE', quantity: 100, amount: 10000,
}, {
  date: '03/20/2020', symbol: 'AAPL', quantity: 50, amount: 22222,
}, {
  date: '03/20/2020', symbol: 'TLTE', quantity: 4, amount: 161.02,
}, {
  date: '03/20/2020', symbol: 'TLTE', quantity: 281, amount: 10034.51,
}, {
  date: '03/21/2020', symbol: 'TLTE', quantity: 200, amount: 8000,
} ]

Мне нужен полезный груз, который возвращает сумму количества и суммы для каждой торговой даты и символа. В частности, в этом примере будет суммироваться количество и сумма для 3 объектов с TLTE и 3/20/20. Результаты полезной нагрузки будут выглядеть так:

const payloadResults = [ {
  date: '03/20/2020', symbol: 'GE', quantity: 100, amount: 10000,
}, {
  date: '03/20/2020', symbol: 'AAPL', quantity: 50, amount: 22222,
}, {
  date: '03/20/2020', symbol: 'TLTE', quantity: 385, amount: 13765.53,
}, {
  date: '03/21/2020', symbol: 'TLTE', quantity: 200, amount: 8000,
} ]

Вот код, который я пробовал:

const fetchResults = [ {
    trade_date: '03/20/2020', symbol: 'TLTE', quantity: 100, amount: 3570,
  }, {
    trade_date: '03/20/2020', symbol: 'GE', quantity: 100, amount: 10000,
  }, {
    trade_date: '03/20/2020', symbol: 'AAPL', quantity: 50, amount: 22222,
  }, {
    trade_date: '03/20/2020', symbol: 'TLTE', quantity: 4, amount: 161.02,
  }, {
    trade_date: '03/20/2020', symbol: 'TLTE', quantity: 281, amount: 10034.51,
  }, {
    trade_date: '03/21/2020', symbol: 'TLTE', quantity: 200, amount: 8000,
  } ]

  const payloadResults = []
  const uniqueTradeDates = Array.from(new Set(fetchResults.map(({ trade_date }) => trade_date)))
  const uniqueSecurityIds = Array.from(new Set(fetchResults.map(({ symbol }) => symbol)))
  for (const td of uniqueTradeDates) {
    for (const s of uniqueSecurityIds) {
      const results = fetchResults.filter((r) => r.symbol === s && r.trade_date === td)
      if (results.length > 0) {
        const totalQuantity = results.reduce((a, b) => a + b.quantity, 0)
        const totalAmount = results.reduce((a, b) => a + b.amount, 0)
        payloadResults.push({
          trade_date: td, symbol: s, quantity: totalQuantity, amount: totalAmount,
        })
      }
    }
  }
  console.log(payloadResults)

Спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 15 апреля 2020

Просто простой l oop с редуктом для создания объекта, ключ которого состоит из полей, которые делают их дубликатами. В данном случае это символ и дата. Так что я oop закончил создание ключа с этими двумя полями. Проверьте, видели ли мы это раньше, если мы только что обновили количество и сумму. Если нет, мы просто добавляем запись.

const fetchResults = [ {
  date: '03/20/2020', symbol: 'TLTE', quantity: 100, amount: 3570,
}, {
  date: '03/20/2020', symbol: 'GE', quantity: 100, amount: 10000,
}, {
  date: '03/20/2020', symbol: 'AAPL', quantity: 50, amount: 22222,
}, {
  date: '03/20/2020', symbol: 'TLTE', quantity: 4, amount: 161.02,
}, {
  date: '03/20/2020', symbol: 'TLTE', quantity: 281, amount: 10034.51,
}, {
  date: '03/21/2020', symbol: 'TLTE', quantity: 200, amount: 8000,
} ]

// Object values returns the values of all the properties in an object
const results = Object.values(
  // we are going to take our array and create a lookup object using reduce
  fetchResults.reduce((obj, data) => {
    // generate the key for our lookup object
    const key = data.symbol + data.date
    // check to see if the result exists yet
    const dayResult = obj[key]
    // if it exists we updated the record values
    if (dayResult) {
      dayResult.quantity += data.quantity
      dayResult.amount += data.amount    
    } else {
      // if it does not exist we copy the record into the  key we made
      obj[key] = { ...data }
    }
    // return our lookup data
    return obj
  }, {})
)

console.log(results)
0 голосов
/ 15 апреля 2020

var fetchResults = [ 
  {date: '03/20/2020', symbol: 'TLTE', quantity: 100, amount: 3570},
  {date: '03/20/2020', symbol: 'GE', quantity: 100, amount: 10000},
  {date: '03/20/2020', symbol: 'AAPL', quantity: 50, amount: 22222},
  {date: '03/20/2020', symbol: 'TLTE', quantity: 4, amount: 161.02},
  {date: '03/20/2020', symbol: 'TLTE', quantity: 281, amount: 10034.51},
  {date: '03/21/2020', symbol: 'TLTE', quantity: 200, amount: 8000}
];

function sumResults(a) {
  var b = {}, c = [], d = 0;
  a.forEach(function(e) {
    var f = e.date + e.symbol;
    if(f in b) c[b[f]].quantity += e.quantity,
      c[b[f]].amount += e.amount;
    else b[f] = d++, c.push(e);
  });
  return c;
}

console.log(sumResults(fetchResults));
0 голосов
/ 15 апреля 2020

Реорганизация исходного массива во вложенный двухуровневый словарь и вычисление итогов путем итерации по статьям словаря:

const fetchResults = [ {
        date: '03/20/2020', symbol: 'TLTE', quantity: 100, amount: 3570,
    }, {
        date: '03/20/2020', symbol: 'GE', quantity: 100, amount: 10000,
    }, {
        date: '03/20/2020', symbol: 'AAPL', quantity: 50, amount: 22222,
    }, {
        date: '03/20/2020', symbol: 'TLTE', quantity: 4, amount: 161.02,
    }, {
        date: '03/20/2020', symbol: 'TLTE', quantity: 281, amount: 10034.51,
    }, {
        date: '03/21/2020', symbol: 'TLTE', quantity: 200, amount: 8000,
    }
];

function aggregate () {
    let dict_aggregate = {}
      ;
      
    fetchResults.forEach ( (item, idx) => {
        if (dict_aggregate[item.date] === undefined) {
            dict_aggregate[item.date] = {};
        }
        if (dict_aggregate[item.date][item.symbol] === undefined) {
            dict_aggregate[item.date][item.symbol] = { quantity: 0, amount: 0.0 };
        }
        dict_aggregate[item.date][item.symbol].quantity  += item.quantity;
        dict_aggregate[item.date][item.symbol].amount    += item.amount;
    });
    
    let a_results = [];
    for (let [s_keyDate, dict_bySymbol] of Object.entries(dict_aggregate)) {
        for (let [s_keySymbol, dict_totals] of Object.entries(dict_bySymbol)) {
            a_results.push ({
                date:       s_keyDate
              , symbol:     s_keySymbol
              , quantity:   dict_totals.quantity
              , amount:     dict_totals.amount
            });
        }
    }
    
    return a_results;
}

let payloadResults = aggregate()
  ;

console.log(JSON.stringify(payloadResults));


 
...