группируйте и суммируйте двойную пару чисел, даже если порядок пар отличается, но одни и те же пары чисел

#javascript

Вопрос:

Мне нужна помощь, чтобы сгруппировать и суммировать двойную пару чисел, даже если порядок отличается, важно то, что эти двойные пары чисел одинаковы, у меня есть этот код с js и unserscorejs, но я не знаю, как проверить, есть ли пара с одинаковыми числами в другом порядке:

Пример логики:

 02 00(1.67$) -- >  1.67$
02 03(1.67$)
02 00(1.67$) -- >   1.67$
00 03(1.67$) -- >  1.67$
00 00(1.67$)
03 00(1.67$) -- >  1.67$
 

желаемый результат:

 02 00(3.33$) --> 02 00   02 00
02 03(1.67$)
00 03(3.33$) --> 00 03   03 00
00 00(1.67$)
 

Мой код:

 let pairs = [{pair: '02 00',money: 1.67},{pair: '02 03',money: 1.67},{pair: '02 00',money: 1.67},{pair: '00 03',money: 1.67},{pair: '00 00',money: 1.67},{pair: '03 00',money: 1.67}]


    var groups = _.groupBy(pairs, 'pair');
    const result = _.map(groups, (value: any, key: any)  =>{
      return { 
        pair: key, 
        money: _.reduce(value, (total: any, o: { money: any; }) =>{ 
            return total   o.money;
        }, 0) 
      };
    });

//output
//[{pair: '02 00',money: 3.33},{pair: '02 03',money: 1.67},{pair: '00 03',money: 1.67},{pair: '00 00',money: 1.67},{pair: '03 00',money: 1.67}]

//expected output
//[{pair: '02 00',money: 3.33},{pair: '02 03',money: 1.67},{pair: '00 03',money: 3.33},{pair: '00 00',money: 1.67}] 

Комментарии:

1. Эй там. Вы показываете то, что пытаетесь сделать, но в чем ваш вопрос? Вы просите кого-то проверить, хорош ли ваш код? Что вам здесь нужно?

2. спасибо, что я отредактировал вопрос, я не знаю, как проверить, есть ли пара с одинаковыми числами в разном порядке, например 00 03 с 1,67 доллара и 03 00 1,67 доллара-это те же числа, но в другом порядке, мне нужно сгруппировать и суммировать это..

3. ага, понял тебя. Я опубликую ответ. Я не буду использовать underscorejs, хотя, если это нормально, так как я не думаю, что это необходимо.

4. большое спасибо, любая помощь очень приветствуется 😀

5. Один простой способ: pair.split(' ').sort().join(' ') даст '00 02' для пары значение либо '00 02' или '02 00' .

Ответ №1:

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

 let pairs = [
    { pair: '02 00', money: 1.67 }, 
    { pair: '02 03', money: 1.67 },
    { pair: '02 00', money: 1.67 }, 
    { pair: '00 03', money: 1.67 },
    { pair: '00 00', money: 1.67 }, 
    { pair: '03 00', money: 1.67 }
]

const groupAndSum = (array) => {
    return Object.entries(
        array.reduce((acc, el) => {
            if (el.pair in acc) {
                acc[el.pair]  = el.money
            } else {
                const key = el.pair.split(' ').reverse().join(' ')
                if (key in acc) acc[key]  = el.money
                else acc[el.pair] = el.money
            }

            return acc
        }, {})
    )
    .map(([pair, money]) => ({ pair, money }))
}

console.log(groupAndSum(pairs)) 
 .as-console-wrapper {
  position: absolute;
  top: 0;
  min-height: 100vh;
} 

Давайте посмотрим изнутри наружу.

  1. Во-первых, мы уменьшаем массив до объекта, в котором ключи являются парами, а значения-суммами этих пар. Это означает, что после того, как мы пройдем через массив с помощью функции reduce, мы получим объект, подобный этому:
 { '02 00': 3.34, '02 03': 1.67, '00 03': 3.34, '00 00': 1.67 }
 

Мы получаем это, просматривая объекты в массиве пар 1 на 1. Мы проверяем, существует ли определенная пара в объекте-аккумуляторе.

  • Если это произойдет, мы просто увеличим существующее значение в объекте-накопителе для этого ключа на сумму текущего объекта, которого мы достигли в нашей итерации.
  • Если это не так, мы разделяем пару, меняем ее местами и соединяем с пробелом, чтобы увидеть, является ли эта строка ключом, который уже существует в объекте-накопителе.
    • Если он существует, мы увеличиваем значение существующего ключа на сумму объекта, которого мы достигли в нашей итерации.
    • Если его не существует, мы создаем новый ключ в нашем объекте-накопителе с парой текущего объекта в качестве ключа и деньгами в качестве начальной стоимости.
  1. Как только мы это сделаем, мы сможем взять записи этого объекта и превратить их в массив с Object.entries. Это должно дать вам массив, подобный этому:
 [
  [ '02 00', 3.34 ],
  [ '02 03', 1.67 ],
  [ '00 03', 3.34 ],
  [ '00 00', 1.67 ]
]
 
  1. Как только у нас будет массив, мы сможем перебрать его, чтобы превратить обратно в нужный нам объект, используя карту.
    Это должно преобразовать приведенный выше массив в следующий результат:
 [
  { pair: '02 00', money: 3.34 },
  { pair: '02 03', money: 1.67 },
  { pair: '00 03', money: 3.34 },
  { pair: '00 00', money: 1.67 }
]