Как я могу объединить массив объектов в другой массив объектов, а также объединить общие ключи - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь отсортировать массив объектов в другой массив объектов, но также комбинирую общие ключи (в данном случае ключ updatedAt)

Пример:

const arr = [
     { id: '5c65ded933767500010c22a6',
       createdAt: '2019-02-14T21:34:17.181Z',
       updatedAt: '2019-02-14T21:38:01.251Z',
       userId: '5b213937cdcd57002d128aa5',
       phoneNumber: '(514) 578-9586',
       orderId: '5c65ded346e0fb000698f102',
       paymentMethods: [],
       shopName: 'test1',
       amount: 3.47,
       type: 'CASHBACK',
       status: 'COMPLETED',
       currency: 'CAD' },
     { id: '5c5226777de2c4000139de58',
       createdAt: '2019-01-30T22:34:31.648Z',
       updatedAt: '2019-01-30T22:37:01.246Z',
       userId: '5b213937cdcd57002d128aa5',
       phoneNumber: '(514) 578-9586',
       orderId: '5c52267146e0fb0006dc852a',
       paymentMethods: [],
       shopName: 'test2',
       amount: 0.24,
       type: 'CASHBACK',
       status: 'COMPLETED',
       currency: 'CAD' },
     { id: '5c019c07c9e77c0001c5ceb8',
       createdAt: '2018-11-30T20:22:31.392Z',
       updatedAt: '2019-01-17T15:53:24.410Z',
       userId: '5b213937cdcd57002d128aa5',
       phoneNumber: null,
       orderId: '5c019bfcc9e77c0006ba4f77',
       paymentMethods: [],
       shopName: 'test3',
       amount: 1.12,
       type: 'CASHBACK',
       status: 'COMPLETED',
       currency: 'CAD' },
     { id: '5c0195cac9e77c0001c5ceb5',
       createdAt: '2018-11-30T19:55:54.646Z',
       updatedAt: '2019-01-17T15:53:12.624Z',
       userId: '5b213937cdcd57002d128aa5',
       phoneNumber: null,
       orderId: '5c0195bfc9e77c0006b3873f',
       paymentMethods: [],
       shopName: 'test4',
       amount: 1.15,
       type: 'CASHBACK',
       status: 'COMPLETED',
       currency: 'CAD' } ]

в

[
  {
    date: '2019-01-30T22:37:01.246Z',
    transactions: [
     {'...THE TRANSACTIONS THAT OCURED ON THE SAME DATE...'},
     {'...THE TRANSACTIONS THAT OCURED ON THE SAME DATE...'},
     {'...THE TRANSACTIONS THAT OCURED ON THE SAME DATE...'},
    ]
  },
  {
    date: '2019-01-14T22:37:01.246Z',
    transactions: [
     {'...THE TRANSACTIONS THAT OCURED ON THE SAME DATE...'},
     {'...THE TRANSACTIONS THAT OCURED ON THE SAME DATE...'},
     {'...THE TRANSACTIONS THAT OCURED ON THE SAME DATE...'},
    ]
  }
]

Я пытался использовать несколько циклов, но это кажется неэффективным, поэтому позже я попытался использовать lodash, и это также кажется неэффективным

вот моя попытка использовать lodash

const mapDaysToTransactions = (transactions) => {
  const mappedTransactions = transactions.reduce((acc, next) => {
  return acc.concat({
    day: next.updatedAt,
    transactions: next
  })
}, [])
const groupedBydays = _.groupBy(mappedTransactions, el => moment(el.day).format('MMMM, d'))
  return Object.keys(groupedBydays).map(d => {
    return {
      date: groupedBydays[d][0].day,
      transactions: _.flattenDeep(groupedBydays[d])
    }
  })
}

Я получаю ожидаемый результат с помощью функции, описанной выше, но я хочу знать, есть ли «лучший» и более оптимальный способ решения такой ситуации.

ОБНОВЛЕНИЕ: еще одно решение, использующее однократное уменьшение

const mapDaysToTransactions = (transactions) => {

  const mapped = transactions.reduce((acc, next) => {
  return acc.concat({
    day: next.updatedAt,
    transactions: next
  })
  }, [])

  return mapped.reduce((acc, transaction) => {
    const date = moment(transaction.day).format('MMMM, d');
    const iso = transaction.day
    const index = acc.findIndex(t => t.date === date);
    const idx = acc.indexOf(date)
  if (idx !== -1) {
    const transactionsByDate = acc[idx];
    const newAcc = [
      ...acc.slice(0, idx),
      ...acc.slice(idx + 1, acc.length),
    ]
    return newAcc.concat({
      date,
      day: iso,
      transactions: transactionsByDate.transactions.concat(transaction),
    });
  }

  return acc.concat({
    date,
    day: iso,
    transactions: [transaction],
  });
 }, []);
}


1 Ответ

0 голосов
/ 31 мая 2019

В reduce вы сначала создаете новый массив, вместо этого вы можете использовать object и группировать значения на основе date, а затем создать массив

const arr = [{ id: '5c65ded933767500010c22a6',createdAt: '2019-02-14T21:34:17.181Z',updatedAt: '2019-02-14T21:38:01.251Z',userId: '5b213937cdcd57002d128aa5',phoneNumber: '(514) 578-9586',orderId: '5c65ded346e0fb000698f102',paymentMethods: [],shopName: 'test1',amount: 3.47,type: 'CASHBACK',status: 'COMPLETED',currency: 'CAD' },{ id: '5c5226777de2c4000139de58',createdAt: '2019-01-30T22:34:31.648Z',updatedAt: '2019-01-30T22:37:01.246Z',userId: '5b213937cdcd57002d128aa5',phoneNumber: '(514) 578-9586',orderId: '5c52267146e0fb0006dc852a',paymentMethods: [],shopName: 'test2',amount: 0.24,type: 'CASHBACK',status: 'COMPLETED',currency: 'CAD' },{ id: '5c019c07c9e77c0001c5ceb8',createdAt: '2018-11-30T20:22:31.392Z',updatedAt: '2019-01-17T15:53:24.410Z',userId: '5b213937cdcd57002d128aa5',phoneNumber: null,orderId: '5c019bfcc9e77c0006ba4f77',paymentMethods: [],shopName: 'test3',amount: 1.12,type: 'CASHBACK',status: 'COMPLETED',currency: 'CAD' },{ id: '5c0195cac9e77c0001c5ceb5',createdAt: '2018-11-30T19:55:54.646Z',updatedAt: '2019-01-17T15:53:12.624Z',userId: '5b213937cdcd57002d128aa5',phoneNumber: null,orderId: '5c0195bfc9e77c0006b3873f',paymentMethods: [],shopName: 'test4',amount: 1.15,type: 'CASHBACK',status: 'COMPLETED',currency: 'CAD' } ]

let final = arr.reduce((op,inp) => {
  let date = inp.updatedAt.substr(0,10)
  op[date] = op[date] || {date, transaction:[]}
  op[date].transaction.push(inp)
  return op
},{})


console.log(Object.values(final))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...