#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;
}
Давайте посмотрим изнутри наружу.
- Во-первых, мы уменьшаем массив до объекта, в котором ключи являются парами, а значения-суммами этих пар. Это означает, что после того, как мы пройдем через массив с помощью функции reduce, мы получим объект, подобный этому:
{ '02 00': 3.34, '02 03': 1.67, '00 03': 3.34, '00 00': 1.67 }
Мы получаем это, просматривая объекты в массиве пар 1 на 1. Мы проверяем, существует ли определенная пара в объекте-аккумуляторе.
- Если это произойдет, мы просто увеличим существующее значение в объекте-накопителе для этого ключа на сумму текущего объекта, которого мы достигли в нашей итерации.
- Если это не так, мы разделяем пару, меняем ее местами и соединяем с пробелом, чтобы увидеть, является ли эта строка ключом, который уже существует в объекте-накопителе.
- Если он существует, мы увеличиваем значение существующего ключа на сумму объекта, которого мы достигли в нашей итерации.
- Если его не существует, мы создаем новый ключ в нашем объекте-накопителе с парой текущего объекта в качестве ключа и деньгами в качестве начальной стоимости.
- Как только мы это сделаем, мы сможем взять записи этого объекта и превратить их в массив с Object.entries. Это должно дать вам массив, подобный этому:
[
[ '02 00', 3.34 ],
[ '02 03', 1.67 ],
[ '00 03', 3.34 ],
[ '00 00', 1.67 ]
]
- Как только у нас будет массив, мы сможем перебрать его, чтобы превратить обратно в нужный нам объект, используя карту.
Это должно преобразовать приведенный выше массив в следующий результат:
[
{ pair: '02 00', money: 3.34 },
{ pair: '02 03', money: 1.67 },
{ pair: '00 03', money: 3.34 },
{ pair: '00 00', money: 1.67 }
]