在js数组中查找顺序值

时间:2018-09-01 18:01:51

标签: javascript

此代码有什么问题?

我正在尝试一种简单的纸牌游戏,看是否有直线。

逻辑是只检查数组中的下一个值是否为当前值+ 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);

4 个答案:

答案 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代替returnbreak

将第一个值作为当前值,并对输入的其余部分进行迭代。将每个条目与当前比较。如果序列中断,则从循环中断。在移至下一个条目之前,请将其设置为新的当前条目。

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))