Javascript Array.reduce多维数组上的对象数组
在我的扑克牌应用程序中,我有一个手牌数组,每只手牌都是随机选择的具有值和套装的卡对象数组:Javascript Array.reduce多维数组上的对象数组,javascript,arrays,functional-programming,poker,Javascript,Arrays,Functional Programming,Poker,在我的扑克牌应用程序中,我有一个手牌数组,每只手牌都是随机选择的具有值和套装的卡对象数组: [ [ { value: 5, suit: 's' }, { value: 4, suit: 's' }, { value: 6, suit: 'c' }, { value: 11, suit: 'd' }, { value: 12, suit: 'c' } ], [ { value: 9, suit: 'd' }, { value: 12, suit: 'h'
[ [ { value: 5, suit: 's' },
{ value: 4, suit: 's' },
{ value: 6, suit: 'c' },
{ value: 11, suit: 'd' },
{ value: 12, suit: 'c' } ],
[ { value: 9, suit: 'd' },
{ value: 12, suit: 'h' },
{ value: 8, suit: 'c' },
{ value: 12, suit: 's' },
{ value: 2, suit: 's' } ],
[ { value: 4, suit: 'h' },
{ value: 6, suit: 's' },
{ value: 10, suit: 'c' },
{ value: 3, suit: 'd' },
{ value: 7, suit: 'd' } ] ]
要准备手部进行评估,我想使用Array.reduce返回手部对象的数组。因此,输出将是:
[
{
values: [5, 4, 6, 11, 12],
suits: ['s', 's', 'c', 'd', 'c']
},
{
values: [9, 12, 8, 12, 2],
suits: ['d', 'h', 'c', 's', 's']
},
{
values: [4, 6, 10, 3, 7],
suits: ['h', 's', 'c', 'd', 'd']
}
]
我试着用嵌套的forEach实现它,但是失败了,我不知道为什么。我有两个console.log,其中的输出与预期的一样,但最终hands与输入相同
let temp = []
hands.forEach((el) => {
temp = el
el = {}
el.values = []
el.suits = []
console.log(el) //expected output
temp.forEach((obj) => {
el.values.push(obj.value)
el.suits.push(obj.suit)
console.log(el) //expected output
})
})
console.log(hands) //same as original
这是一个使用嵌套的
Array.prototype.reduce
函数的解决方案:
[代码>var数组<<代码>var数组=[{{{{{值:5,西服:5,西服:''s},{{{值:5,西服:5,西服:5,西服:'5,西服:'''''''s},{{值:5,{{{值:5,价值:5,西服:5,西服:'s},{{{值:6,西服:'c'},{{值:6,价值:6,价值:6,西服:{{{{{值:5,价值:11,西服服:'d},{{{{{值:11,西服:'d,{{{{{{{值:11,西服:'d,{{{{{{价值:11,西服:'d},,{{{{{{{{{价值:11,西服:'d,{{{{{{{value:7,suit:'d'}]];
var result=array.reduce(函数(p,c){
p、 推动(c.减少(功能a、b){
a、 值。推送(b值);
a、 套装。推(b.套装);
返回a;
},{values:[],suits:[]});
返回p;
},[]);
控制台日志(结果)代码>
.as控制台包装{top:0;最大高度:100%!important;}
下面是一个使用字符串concat
和reduce
的简单解决方案。您可以尝试以下方法:
var reduced = [];
//here a is your initial array
for(var i=0; i<a.length;i++){
reduced.push(a[i].reduce(function(prev,curr){
var obj={value:prev.value+','+curr.value,suit:prev.suit+','+curr.suit};return obj}));
}
console.log(reduced)
var reduced=[];
//这是您的初始数组
对于(var i=0;i您必须考虑输入数据(data
)和输出(data'
)的形状
注意1:1手和HAND'
之间的关系,这意味着我们将使用Array.prototype.map
进行一次转换。另一方面,CARD
与HAND'之间有N:1关系,因为我们将使用Array.prototype.reduce
进行转换
因此,请记住,在我们工作时,我们将进行映射和减少
const数据=
[{value:5,suit's'},
{value:4,suit's'},
{value:6,suit'c'},
{value:11,suit'd'},
{value:12,suit'c'}],
[{value:9,suit'd'},
{value:12,suit'h'},
{value:8,suit'c'},
{value:12,suit's'},
{值:2,suit:'s'}],
[{value:4,suit'h'},
{value:6,suit's'},
{value:10,suit'c'},
{value:3,suit'd'},
{value:7,suit'd'}]]
让输出=
data.map(卡片=>
减少({value,suit},{value,suit})=>({
值:[…值,值],
西服:[……西服,西服]
}),{值:[],适合:[]})
console.log(输出)
“我想使用reduce”…那么你的代码尝试在哪里?这不是一个代码编写服务。这个网站的工作原理是你发布的代码没有按预期工作,人们帮助你修复我尝试的代码,我不认为他们会有帮助,因为似乎任何有效的答案都是对我的实现的完全重写。公平的批评当然,我会记住这一点。但是你也没有从错误中吸取教训。给一个人一条鱼,或者教一个人钓鱼为什么必须使用reduce
?使用forEach
el
似乎更简单。el
是函数的一个局部变量,它被重置为{}
每次通过forEach
循环。你的代码从不修改指针
。他希望结果中包含数组,而不是串联字符串。@Barmar感谢你的评论…编辑帖子以反映更改这是一个愚蠢的解决方案。既然你可以在第一步创建数组,为什么要创建一个字符串然后拆分成一个数组e?@Barmar这是一个公平的评论。请看编辑2,然后带上你得到的:D。。。
for(var i=0; i<a.length;i++){
var tempElm =a[i].reduce(function(prev,curr) {
var obj= {value:prev.value+','+curr.value,suit:prev.suit+','+curr.suit};return obj});
tempElm['value'] = tempElm['value'].split();
tempElm['suit']= tempElm['suit'].split();
reduced.push(tempElm);
}
console.log(reduced)
var reduced = [];
for(var i=0; i<a.length;i++){
var valArray = []; var suitArray=[];
var tempElm = a[i].reduce(function(prev,curr) {
valArray.push(curr.value);suitArray.push(curr.suit);
var obj= {value:valArray,suit:suitArray};
return obj;
},null);
console.log(reduced)