检查元素组合存在于打字稿数组中的最佳方法
best way to check element combination exist in array in typescript
我有一些元素的数组,我想检查数组中是否存在某些元素组合,目标元素后面是 checkingSet 的任何元素,如果是,则 return true 否则,return 错误的。例如,
如果 inputArray 是 ['a', 'b', 'c', 'd'] 并且寻找组合是 ['a', 'd'] 那么它应该 return true 因为 inputArray 的顺序都是正确的。
如果 inputArray 是 ['d'、'b'、'c'、'd'、'a'] 并且组合是 ['a'、'd' ], 那么它应该是 false 因为 inputArray 包括两个元素但是顺序错误
或
isExist(['a', 'd']) => true
isExist(['a', 'a', 'd']) => true
isExist(['e', 'd']) => false
我可以使用 Set 和 while 循环
但我想知道是否有更优雅或更现代的方式来做?
export function isExist(checkArray): boolean {
let hasA = false;
let hasB = false;
checkingSet = new Set(['b', 'c', 'd'])
const target = 'a'
inputArray = [...checkArray]
while (inputArray && !!inputArray.length) {
const lastOne = inputArray.pop();
if (!hasA && !!lastOne) {
hasA = chekcingSet.has(lastOne);
}
if (!hasB && !!lastOne) {
hasB = lastOne === target;
}
if (hasA && hasB) {
return true;
}
}
return false;
}
要检查数组是否包含 'a'
,并且在此之后 'a'
中至少有一个 ['b', 'c', 'd']
在数组中,您可以执行此操作。首先,在该起始索引之后获取该数组中的 index of the first 'a'
in the array, then check if some value of ['b', 'c', 'd']
is included。
function doesExist(arr) {
const startPos = arr.indexOf('a')
if (startPos < 0)
return false
return ['b', 'c', 'd'].some(char => arr.includes(char, startPos + 1))
}
console.log(doesExist(['a', 'd']))
console.log(doesExist(['a', 'a', 'd']))
console.log(doesExist(['e', 'd']))
console.log(doesExist(['d', 'a']))
这是通用版本,O(n)。
function doesDupleExistInOrder([el1, el2], arr) {
let index = arr.indexOf(el1)
if (index == -1) return false;
return arr.includes(el2, index + 1)
}
console.log(doesDupleExistInOrder(["a", "d"], ["a", "b", "c", "d", "e"])); // true
console.log(doesDupleExistInOrder(["a", "b"], ["a", "b", "c", "d", "e"])); // true
console.log(doesDupleExistInOrder(["d", "e"], ["a", "b", "c", "d", "e"])); // true
console.log(doesDupleExistInOrder(["d", "a"], ["a", "b", "c", "d", "e"])); // false
console.log(doesDupleExistInOrder(["d", "a"], ["a"])); // false
console.log(doesDupleExistInOrder(["d", "a"], [])); // false
如果你想要一个特定的版本,那么只需柯里化通用函数 AKA:
let doesADExist = arr => doesDupleExistInOrder(["a", "d"], arr);
console.log(doesADExist(["a", "b", "c", "d", "e"])); // true
我有一些元素的数组,我想检查数组中是否存在某些元素组合,目标元素后面是 checkingSet 的任何元素,如果是,则 return true 否则,return 错误的。例如, 如果 inputArray 是 ['a', 'b', 'c', 'd'] 并且寻找组合是 ['a', 'd'] 那么它应该 return true 因为 inputArray 的顺序都是正确的。 如果 inputArray 是 ['d'、'b'、'c'、'd'、'a'] 并且组合是 ['a'、'd' ], 那么它应该是 false 因为 inputArray 包括两个元素但是顺序错误 或
isExist(['a', 'd']) => true
isExist(['a', 'a', 'd']) => true
isExist(['e', 'd']) => false
我可以使用 Set 和 while 循环 但我想知道是否有更优雅或更现代的方式来做?
export function isExist(checkArray): boolean {
let hasA = false;
let hasB = false;
checkingSet = new Set(['b', 'c', 'd'])
const target = 'a'
inputArray = [...checkArray]
while (inputArray && !!inputArray.length) {
const lastOne = inputArray.pop();
if (!hasA && !!lastOne) {
hasA = chekcingSet.has(lastOne);
}
if (!hasB && !!lastOne) {
hasB = lastOne === target;
}
if (hasA && hasB) {
return true;
}
}
return false;
}
要检查数组是否包含 'a'
,并且在此之后 'a'
中至少有一个 ['b', 'c', 'd']
在数组中,您可以执行此操作。首先,在该起始索引之后获取该数组中的 index of the first 'a'
in the array, then check if some value of ['b', 'c', 'd']
is included。
function doesExist(arr) {
const startPos = arr.indexOf('a')
if (startPos < 0)
return false
return ['b', 'c', 'd'].some(char => arr.includes(char, startPos + 1))
}
console.log(doesExist(['a', 'd']))
console.log(doesExist(['a', 'a', 'd']))
console.log(doesExist(['e', 'd']))
console.log(doesExist(['d', 'a']))
这是通用版本,O(n)。
function doesDupleExistInOrder([el1, el2], arr) {
let index = arr.indexOf(el1)
if (index == -1) return false;
return arr.includes(el2, index + 1)
}
console.log(doesDupleExistInOrder(["a", "d"], ["a", "b", "c", "d", "e"])); // true
console.log(doesDupleExistInOrder(["a", "b"], ["a", "b", "c", "d", "e"])); // true
console.log(doesDupleExistInOrder(["d", "e"], ["a", "b", "c", "d", "e"])); // true
console.log(doesDupleExistInOrder(["d", "a"], ["a", "b", "c", "d", "e"])); // false
console.log(doesDupleExistInOrder(["d", "a"], ["a"])); // false
console.log(doesDupleExistInOrder(["d", "a"], [])); // false
如果你想要一个特定的版本,那么只需柯里化通用函数 AKA:
let doesADExist = arr => doesDupleExistInOrder(["a", "d"], arr);
console.log(doesADExist(["a", "b", "c", "d", "e"])); // true