例如:我设置了1,3,4,5,6,7,8,10,11
要实现的主要目标是检查给定系列是否处于系列的起始部分或结束部分,而不使用jquery或javacript中断该系列。
我们将非常感谢你的帮助。
提前感谢
发布于 2017-06-22 17:40:11
您可以使用两次传递方法,首先为所有子数组项从开始和结束收集相同索引下的比较(稍后表示为左侧和右侧)。
为了指示结果,返回4个状态,这意味着
0 -没有匹配,从左边和右边都不匹配值,1 -数组左侧的项匹配,2 -数组右侧的项匹配,3 -双方的项目匹配。在收集表示匹配和位置的值之后,必须将值合并到想要的结果true或false。
要检查每个值,您需要另一个值,该值表示预期的一面。在开始时,预期的侧设置为1,因为它从左侧开始检查。
Array#every回调的临时结果是对实际值是否大于或等于预期值进行一次检查。这包括指示符3,因为这个值位于两边。零的值也退出循环。
如果找到了2的值,则表示右侧,并且以下所有元素都必须大于2,因此预期值设置为2。
给出的解决方案可以缩短为只返回所需的布尔值。
function check(array, subarray) {
var expected = 1,
temp = subarray.map(function (a, i) {
var offset = array.length - subarray.length;
return (a === array[i]) + 2 * (a === array[i + offset]);
}),
result = temp.every(function (a) {
var r = a >= expected;
if (a === 2) {
expected = 2;
}
return r;
});
return temp.concat(result);
}
var array = [1, 3, 4, 5, 6, 7, 8, 10, 11];
console.log(check(array, [1, 3, 4])); // true
console.log(check(array, [8, 10, 11])); // true
console.log(check(array, [1, 3, 10, 11])); // true
console.log(check(array, [1, 3, 6, 8])); // false
console.log(check([1, 2, 3, 4, 5, 6], [1, 4, 3, 6])); // false
console.log(check([1, 2, 3, 4, 5, 6], [1, 4, 3, 6])); // false
console.log(check([1, 2, 3, 2, 3, 4], [3, 2, 3, 2])); // false
console.log(check([1, 2, 3, 2, 3, 4], [1, 2, 3, 4])); // true.as-console-wrapper { max-height: 100% !important; top: 0; }
没有临时数组的短版本。
function check(array, subarray) {
var offset = array.length - subarray.length,
expected = 1;
return subarray.every(function (a, i) {
var state = (a === array[i]) + 2 * (a === array[i + offset]),
result = state >= expected;
if (state === 2) {
expected = 2;
}
return result;
});
}
var array = [1, 3, 4, 5, 6, 7, 8, 10, 11];
console.log(check(array, [1, 3, 4])); // true
console.log(check(array, [8, 10, 11])); // true
console.log(check(array, [1, 3, 10, 11])); // true
console.log(check(array, [1, 3, 6, 8])); // false
console.log(check([1, 2, 3, 4, 5, 6], [1, 4, 3, 6])); // false
console.log(check([1, 2, 3, 4, 5, 6], [1, 4, 3, 6])); // false
console.log(check([1, 2, 3, 2, 3, 4], [3, 2, 3, 2])); // false
console.log(check([1, 2, 3, 2, 3, 4], [1, 2, 3, 4])); // true.as-console-wrapper { max-height: 100% !important; top: 0; }
发布于 2017-06-22 17:58:24
一种简单的方法:从两个数组的开头和结尾删除匹配的数字,并查看是否有剩余的数据。
var checkIt = function(arr,subarr) {
// strip off matching numbers at the beginning
while (subarr.length && arr[0] === subarr[0]) {
arr.shift();
subarr.shift();
}
// strip off matching numbers at the end
while (subarr.length && arr[arr.length - 1] === subarr[subarr.length - 1]) {
arr.pop();
subarr.pop();
}
// if there aren't any leftovers, return true
return (subarr.length === 0)
}
console.log(checkIt( [1, 3, 4, 5, 6, 7, 8, 10, 11],[1, 3, 4]));
console.log(checkIt( [1, 3, 4, 5, 6, 7, 8, 10, 11],[8, 10, 11]));
console.log(checkIt( [1, 3, 4, 5, 6, 7, 8, 10, 11],[1, 3, 10, 11]));
console.log(checkIt( [1, 3, 4, 5, 6, 7, 8, 10, 11],[1, 3, 6, 8]));
// pathological edge case:
console.log(checkIt( [1,2,3,2,1],[1,2,3,2,1] ))
// This returns true, but based on the rules of the puzzle I'm honestly not sure whether that's correct.
发布于 2017-06-22 18:23:24
您将从左到右,从右到左迭代子数组,并在“对应位置”的主数组中的值与值不匹配的地方停止,即从数组的同一侧计数位置。
如果在两个循环的末尾,子数组的所有值都匹配,即两个索引互相交叉,则结果是true。
以下是代码:
function isSubsetAtEnds(array, subarray) {
const diff = array.length - subarray.length;
let i, j;
if (diff < 0) return false;
for (i = 0; i < subarray.length; i++)
if (array[i] !== subarray[i]) break;
for (j = subarray.length - 1; j >= i; j--)
if (array[j+diff] !== subarray[j]) break;
return j < i;
}
var array = [1, 3, 4, 5, 6, 7, 8, 10, 11];
console.log(isSubsetAtEnds(array, [1, 3, 4])); // true
console.log(isSubsetAtEnds(array, [8, 10, 11])); // true
console.log(isSubsetAtEnds(array, [1, 3, 10, 11])); // true
console.log(isSubsetAtEnds(array, [1, 3, 6, 8])); // false
https://stackoverflow.com/questions/44699384
复制相似问题