Javascript 查找具有条件的数组对象序列
因为我在做一个拉米纸牌游戏,所以我在融合纸牌时要检查三个条件Javascript 查找具有条件的数组对象序列,javascript,jquery,arrays,Javascript,Jquery,Arrays,因为我在做一个拉米纸牌游戏,所以我在融合纸牌时要检查三个条件 找到一组具有相同套装的纯序列。(强制性) 找到一组具有相同套装的纯或不纯序列(没有或有小丑) 寻找一组具有纯序列或非纯序列或具有不同套色的相同价值卡 纯序列平均值:3,4,5,6 不纯序列意味着:3,4,小丑,6(这里小丑可以被认为是5) 让我们来处理案例1 我的群组是: var arr4 = [{"value":2,"suit":"hearts"},{"value":5,"suit":"hearts"},{"value":3,"su
var arr4 = [{"value":2,"suit":"hearts"},{"value":5,"suit":"hearts"},{"value":3,"suit":"hearts"},{"value":4,"suit":"spades"}];
var arr5 = [{"value":5,"suit":"hearts"},{"value":7,"suit":"hearts"},{"value":20,"suit":"joker"},{"value":8,"suit":"hearts"}];
var arr6 = [{"value":1,"suit":"hearts"},{"value":2,"suit":"hearts"},{"value":4,"suit":"hearts"},{"value":3,"suit":"hearts"}];
var arr7 = [{"value":1,"suit":"diams"},{"value":4,"suit":"hearts"},{"value":4,"suit":"hearts"},{"value":3,"suit":"hearts"}];
在这里,arr6
是一个纯粹的序列,因为每个项目都有相同的套装<代码>arr4不包含所有相同的套装,因此它不是
用于案例1
我试着找到一个纯序列的数组,没有这样的套装
var arr1=[“4”、“1”、“3”、“5”];
var arr2=[“5”、“4”、“3”、“6”];
var arr3=[“1”、“5”、“3”、“6”];
函数inSeq(arr){
return arr.sort(函数(a,b){return a-b;})
.each(函数(n,i,arr){
返回i==0 | | n-arr[i-1]==1;
});
}
函数findArrWithSeq(arrs){
对于(变量i=0;i
我可以建议您使用吗
var arr4=[{“value”:2,“suit”:“hearts”},{“value”:5,“suit”:“hearts”},{“value”:3,“suit”:“hearts”},{“value”:4,“suit”:“spades”};
var arr5=[{“价值”:5,“诉讼”:“心脏”},{“价值”:7,“诉讼”:“心脏”},{“价值”:20,“诉讼”:“小丑”},{“价值”:8,“诉讼”:“心脏”}];
var arr6=[{“值”:1,“适合”:“心”},{“值”:2,“适合”:“心”},{“值”:4,“适合”:“心”},{“值”:3,“适合”:“心”};
var arr7=[{“值”:1,“适合”:“直径”},{“值”:4,“适合”:“心脏”},{“值”:4,“适合”:“心脏”},{“值”:3,“适合”:“心脏”}];
var arr8=[{“值”:1,“套装”:“钻石”},{“值”:12,“套装”:“钻石”},{“值”:11,“套装”:“钻石”},{“值”:13,“套装”:“钻石”};//另一种捕获条件
函数inSeq(arr){//与inSeq()方法相同
//log(JSON.stringify(arr));
返回u.every(arr,function(n,i,arr){
//log(JSON.stringify(n)+“:”+i);
返回i==0 | | n.value-arr[i-1]。value==1 | |(arr[0]。value==1&&(n.value==11 | | n.value==12));//检查“另一个捕获”
});
}
功能检查PureSeq(arr,套装){
var sCards=..where(arr,{suit:suit});//获取特定suit的所有卡片
//控制台。原木(伤疤。长度);
如果(sCards.length<3 | | sCards.length!=arr.length){//如果同一套卡片小于3或者长度与原始数组长度不匹配,则返回false……这意味着您不需要检查卡片是否按顺序排列
返回false;
}
sCards=..sortBy(sCards,'value');//根据'value'对同一套牌的所有牌进行排序
返回inSeq(疤痕);
}
函数日志(str){//只是一个util函数。我正在屏幕上显示它。你们可以把它放在控制台上
//console.log(str);
$('').html(str).appendTo('#output');
}
$(函数(){
var arrs=[arr4,arr5,arr6,arr7,arr8];//数组数组,只是为了便于处理,与您在问题中创建[arr1,arr2,arr3]的方式类似
var suits=[‘红心’、‘钻石’、‘黑桃’、‘梅花’];
_.each(arrs,function(arr,i){//处理每个数组
//log(JSON.stringify(arr));
_.每一套{//
//控制台日志(套装);
如果(检查pureSeq(arr,suit)){
log('找到'+suit+'的纯序列:'+JSON.stringify(arr)+'');
}否则{
log('未找到'+suit+'的纯序列:'+JSON.stringify(arr));
//您可以将当前“arr”推送到另一个数组,以便进一步处理案例2和案例3
}
});
});
});
工作演示可以找到
注意:它只处理第一种情况(包括您定义的“另一个陷阱”)我的2美分将是使用一个汇总函数来处理一个卡阵列,以处理所有情况:
函数getSummary(卡片){
cards.sort((c1,c2)=>c1.value-c2.value);//按值对卡片进行排序
让jokerCount=0,JokerUsed=0,res;
for(设i=cards.length-1;i>=0;i--)//首先从末尾开始处理小丑(注意,这是假设他们也有较大的值20)
{
让{suit,value:val}=cards[i];//将suit和value属性分解为变量
如果(西装==“小丑”)
jokerCount++;//分别处理小丑
否则{
如果(res==未定义){//第一张非小丑卡->初始值
res={uniqueSuit:suit,startOfSequence:val};
if(jokerCount)res.jokersUsed=true;
}
否则{
if(suit!==res.uniqueSuit)//检查是否有更多的西装
删除res.uniqueSuit;//没有唯一的suit->删除属性(可选:将道具设置为“无”)
如果(res.startOfSequence&--res.startOfSequence!=val){//检查序列是否完整
if(val==1&&i==0&&res.startOfSequence==10)//Ace
res.startOfSequence++;//Ace用作14
否则{
设间隙=res.startOfSequence-val;
如果(间隔>0&&jokerCount>=gap){//如果还有足够的小丑,使用他们(序列仍然完整)
jokerCount-=缺口;
jokersUsed+=间隙;
res.startOfSequence=val;
}
其他的
删除res.startOfSequence;//无序列->从res中删除属性
}
}
}
}
}
如果(res==未定义){
//只有小丑(这可能吗?->创建序列或匹配值
res={};
var arr4 = [{"value":2,"suit":"hearts"},{"value":5,"suit":"hearts"},{"value":3,"suit":"hearts"},{"value":4,"suit":"spades"}];
var arr5 = [{"value":5,"suit":"hearts"},{"value":7,"suit":"hearts"},{"value":20,"suit":"joker"},{"value":8,"suit":"hearts"}];
var arr6 = [{"value":1,"suit":"hearts"},{"value":2,"suit":"hearts"},{"value":4,"suit":"hearts"},{"value":3,"suit":"hearts"}];
var arr7 = [{"value":1,"suit":"diams"},{"value":4,"suit":"hearts"},{"value":4,"suit":"hearts"},{"value":3,"suit":"hearts"}];
var arr8 = [{"value":1,"suit":"diams"},{"value":12,"suit":"diams"},{"value":11,"suit":"diams"},{"value":13,"suit":"diams"}]; // another catch condition
function inSeq(arr) { // identical to your inSeq() method
//console.log(JSON.stringify(arr));
return _.every(arr, function(n, i, arr) {
//console.log(JSON.stringify(n) + ":" + i);
return i === 0 || n.value - arr[i - 1].value === 1 || (arr[0].value == 1 && (n.value == 11 || n.value == 12)); // checking for 'another catch'
});
}
function checkPureSeq(arr, suit){
var sCards = _.where(arr, {suit: suit}); // get all the cards of specific suit
//console.log(sCards.length);
if(sCards.length < 3 || sCards.length != arr.length) { // if same suit cards are less than 3 or the length doesn't match the original array length return false ... meaning you don't need to check if the cards are in sequence
return false;
}
sCards = _.sortBy(sCards, 'value'); // sort all the cards of same suit based on 'value'
return inSeq(sCards);
}
function log(str){ // just a util function. I'm displaying it on screen. You can put it on console
//console.log(str);
$('<div>').html(str).appendTo('#output');
}
$(function(){
var arrs = [arr4, arr5, arr6, arr7, arr8]; // array of arrays, just for ease of processing, similar to the way you had created [arr1, arr2, arr3] in your question
var suits = ['hearts', 'diams', 'spades', 'clubs'];
_.each(arrs, function(arr, i){ // process each array
//console.log(JSON.stringify(arr));
_.each(suits, function(suit){ // for each suit
//console.log(suit);
if(checkPureSeq(arr, suit)){
log('<h4>Found pure sequence of ' + suit + ': ' + JSON.stringify(arr) + '</h4>');
} else {
log('Pure sequence of ' + suit + ' not found: ' + JSON.stringify(arr));
// you may push current `arr` to another array for further processing of case 2 and case 3
}
});
});
});