英文:
Count iterations of an object array property in an array of objects
问题
我正在制作一个彩票系统,用来练习 JavaScript 和 React。
我在创建一个函数时遇到了困难,该函数将检查我的 betObject 数组中最常见的投注组合,并列出包含此组合的每个投注(以便稍后计算投注金额的总和)。
投注有两种类型:pair 和 shuffle。Pair 投注包括 2 个数字的组合,而 shuffle 投注包括 3 到 6 个数字的组合。开奖结果是一个 2 个数字的组合。
我尝试过使用 filter、map 和方程式来解决这个问题,我正在尝试使用 For 循环,但我不知道如何使用它来帮助解决我的问题。我还尝试过将投注组合传递给 Int 或 String,但没有成功。
betObject 数组的结构如下:
[![Bet Object Array log(int are purple, string are green)](https://i.stack.imgur.com/PMQ5J.png)](https://i.stack.imgur.com/PMQ5J.png)
以下是迄今为止的函数:
const betsWatchList = () => {
// 创建一个观察列表数组以存储常见投注数组
let watchlist = [];
// 循环遍历观察列表
for (let j = 0; j < watchlist.length; j++) {
// 映射遍历 betList
betList.map((bet, i) => {
// 如果 betlist 的组合与 watchlist 匹配
if (watchlist[j].combination == bet.combination) {
// 基于原始创建新的 watchObject
let watchObject = {
combination: bet.combination,
total: watchlist[j].combination + bet.betTotal,
count: watchlist[j].count++
}
// 用更新后的内容替换原始内容
watchlist.splice(j, watchObject);
} else {
// 创建新的 watchObject
let watchObject = {
combination: bet.combination,
total: bet.betTotal,
count: 1
}
// 推送新的 watchObject
watchlist.push(watchObject)
}
})
}
};
你应该如何处理这个问题?为了更快地找到解决方案,你应该对我的方法做出哪些改变?
谢谢!
英文:
I am making a lottery system to practice javascript and react.
I am having a hard time creating a function that will check my betObject array for the most common bet combination and list each bet featuring this combination(to make a sum of the bet amounts later).
Bets come in two types : pair and shuffle. Pair bets have a combination of 2 numbers while shuffle bets have a combination of 3 to 6 numbers. Result of the draw is a 2 number combination.
I have tried using filter, map and equations to make this work, I am trying to make use of a For loop but I can't see how to use it to help with my problem.I have also tried pasing the bet.combination to an Int or a String without success.
the betObject array is structured as follows :
Here is my function so far :
const betsWatchList = () => {
// Create watchlist array to store common bets array
let watchlist = [];
// loop through watchlist
for(let j = 0; j < watchlist.length; j++){
//map through betList
betList.map((bet, i) => {
// if betlist combination matches watchlist
if (watchlist[j].combination == bet.combination){
// create new watchobject based on original
let watchObject = {
combination : bet.combination,
total : watchlist[j].combination + bet.betTotal,
count : watchlist[j].count++
}
//replace original by updated
watchlist.splice(j, watchObject);
}else{
//create new watchobject
let watchObject = {
combination : bet.combination,
total : bet.betTotal,
count: 1
}
//push new watchobject
watchlist.push(watchObject)
}
})
}
};
How would you approach this problem ? What should I change about my approach to find the solution faster ?
Thank you !
答案1
得分: 0
以下是翻译好的部分:
不要使用 ==
来测试两个数组是否包含相同的 值
尝试替换
if (watchlist[j].combination == bet.combination)
为
if (JSON.stringify(watchlist[j].combination) == JSON.stringify(bet.combination))
不要使用 .splice
,为什么不直接写入数组元素?
代码中缺少 1,
。应该改为 .splice(j, 1, watchObject)
。然而,这都是不必要的复杂操作,实际上不需要使用 .splice
,因为我们不会改变元素数量。
替换
watchlist.splice(j, watchObject);
为
watchlist[j] = watchObject;
没有理由使用 .map
.map
会让程序员期望循环代码返回结果,而我们可以使用 .forEach
,这样可以明确表示不会返回结果。
循环顺序是相反的
外层循环应该遍历下注列表。对于每个下注,内层循环应该检查观察列表中的每个项目。
为了简化,我使用了 .forEach
这避免了创建和递增迭代器 i
。
function betsWatchList(betList) {
const watchList = [];
betList.forEach(bet => {
let found = false;
// 如果在 watchList 中已存在:更新
watchList.forEach((watchItem, j) => {
if (JSON.stringify(watchItem.combination) === JSON.stringify(bet.combination)) {
watchItem.total += bet.betTotal;
watchItem.count += 1;
found = true;
}
});
// 如果在 watchList 中不存在,追加新的 watchList 条目
if (!found) {
watchList.push({
combination: bet.combination,
total: bet.betTotal,
count: 1
});
}
})
return watchList;
}
const betList = [{
combination: [1, 2, 3],
betTotal: 10
}, {
combination: [1, 2, 3],
betTotal: 20
}, {
combination: [1, 2, 4],
betTotal: 10
}]
console.log(betsWatchList(betList))
英文:
Don't use ==
to test whether two arrays contain identical values
Try replacing
if (watchlist[j].combination == bet.combination)
with
if (JSON.stringify(watchlist[j].combination) == JSON.stringify(bet.combination))
Instead of .splice
, why not just write to the array element?
The code has a missing 1,
. It should read .splice(j, 1, watchObject)
. However, it is all unnecessarily complicated, and doesn't actually need a .splice
as we are not changing the number of elements.
Replace
watchlist.splice(j, watchObject);
with
watchlist[j]= watchObject;
There was no reason to use .map
.map
makes the programmer expect the code loop to return a result, when we could have used .forEach
which makes it clear that it will not.
The loops are in reverse order
You need the outer loop to be over the bets. For each bet, you want the inner loop to examine each item in the watchList.
Just for simplicity, I have used .forEach
This avoids having to create and increment an iterator i
.
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
function betsWatchList(betList) {
const watchList = [];
betList.forEach(bet => {
let found = false;
// If already exists in watchList: update
watchList.forEach((watchItem, j) => {
if (JSON.stringify(watchItem.combination) === JSON.stringify(bet.combination)) {
watchItem.total += bet.betTotal
watchItem.count += 1
found = true
}
});
// If doesn't exist in watchList, append new watchList entry
if (!found) {
watchList.push({
combination: bet.combination,
total: bet.betTotal,
count: 1
});
}
})
return watchList
}
const betList = [{
combination: [1, 2, 3],
betTotal: 10
}, {
combination: [1, 2, 3],
betTotal: 20
}, {
combination: [1, 2, 4],
betTotal: 10
}]
console.log(betsWatchList(betList))
<!-- end snippet -->
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论