此代码有什么问题?
我正在尝试一种简单的纸牌游戏,看是否有直线。
逻辑是只检查数组中的下一个值是否为当前值+ 1
let arr = [
[ 'd', 13 ],
[ 'f', 12 ],
[ 'z', 11 ],
[ 'd', 10 ],
[ 'd', 9 ]
];
arr = arr.sort((a,b) => a[1] - b[1]);
const isSeq = arr => {
for (let i = 0; i < arr.length - 1; i++) {
console.log(arr[i][1]+1, arr[i+1][1])
if (arr[i][1]+1 !== arr[i+1][1]) {
return false;
} else {
return true;
}
}
}
isSeq(arr);
答案 0 :(得分:4)
您需要删除else部分,因为即使在第一次迭代中为true,这也会退出该函数。
let arr = [[ 'd', 13 ], [ 'f', 12 ], [ 'z', 11 ], [ 'd', 10 ], [ 'd', 9 ]];
arr = arr.sort((a, b) => a[1] - b[1]);
const isSeq = arr => {
for (let i = 0; i < arr.length - 1; i++) {
console.log(arr[i][1] + 1, arr[i + 1][1]);
if (arr[i][1] + 1 !== arr[i + 1][1]) {
return false;
}
}
return true;
};
console.log(isSeq(arr));
答案 1 :(得分:3)
您会在第一次检查后以一种或另一种方式快速返回。
if (arr[i][1]+1 !== arr[i+1][1]) {
return false;
} else {
return true;
}
完成所有检查后,您应该返回:
for (let i = 0; i < arr.length - 1; i++) {
console.log(arr[i][1]+1, arr[i+1][1])
if (arr[i][1]+1 !== arr[i+1][1]) {
return false;
}
}
return true;
答案 2 :(得分:2)
您也可以使用Array#every()
进行此操作:
let arr = [
['d', 13],
['f', 12],
['z', 11],
['d', 10],
['d', 9]
];
arr = arr.sort((a, b) => a[1] - b[1]);
function isSeq(data) {
return data.every((num, i) => (i === data.length - 1) || (num[1] === (data[i + 1][1] - 1)));
}
console.log(isSeq(arr));
此方法首先检查索引是否为最后一个,是否不确保当前元素等于array[i+1]-1
答案 3 :(得分:1)
您可以使用if else
代替return
和break
:
将第一个值作为当前值,并对输入的其余部分进行迭代。将每个条目与当前比较。如果序列中断,则从循环中断。在移至下一个条目之前,请将其设置为新的当前条目。
let arr = [
[ 'd', 13 ],
[ 'f', 12 ],
[ 'z', 11 ],
[ 'd', 10 ],
[ 'd', 9 ]
];
arr = arr.sort((a,b) => a[1] - b[1]);
const isSeq = arr => {
let isStraight = true
let current = arr[0][1]
for (let i = 1; i < arr.length; i++) {
if (arr[i][1] !== current + 1) {
isStraight = false
break
}
current = arr[i][1]
}
return isStraight
}
console.log(isSeq(arr))