组和双对数字,即使这对数字的顺序不同但它们是相同的对

  • 本文关键字:数字 顺序 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}]

为了处理这个问题,您只需要做一些字符串操作来比较对。我把代码贴出来,然后一步一步地看一遍。

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. 一旦这样做了,我们就可以将该对象的项转换为object .entries数组。这会给你一个像这样的数组:
[
[ '02 00', 3.34 ],
[ '02 03', 1.67 ],
[ '00 03', 3.34 ],
[ '00 00', 1.67 ]
]
  1. 一旦我们有了数组,我们可以迭代它,用map把它变成我们想要的对象。这将把上面的数组转换成以下结果:
[
{ pair: '02 00', money: 3.34 },
{ pair: '02 03', money: 1.67 },
{ pair: '00 03', money: 3.34 },
{ pair: '00 00', money: 1.67 }
]

最新更新