如何在数组中查找相同元素的子序列
How to find subsequences of identical elements in an array
我正在为我的爱好任务寻找算法。
例如我们有测试数据案例:
var case1 = ['green', 'red', 'red', 'blue', 'green', 'green', 'green'];
var case2 = ['blue', 'blue', 'green', 'yellow', 'blue', 'orange', 'green', 'green', 'green', 'green'];
var case3 = ['purple', 'blue', 'blue', 'blue', 'red'];
输出:
var result1 = ['red', 'red', 'green', 'green', 'green'];
var result2 = ['blue', 'blue', 'green', 'green', 'green', 'green'];
var result3 = ['blue', 'blue', 'blue'];
谁能告诉我应该使用哪种算法?重复的经典方式 - 不像我看的那样。
所以在 javascript 中,一个天真的实现是:
function selectSequential(source) {
var result = [];
for (let i = 0; i < source.length; i++) {
if ((i != source.length-1 && source[i+1] === source[i])
|| (i != 0 && source[i-1] === source[i])) {
result.push(source[i]);
}
}
return result;
}
简短版
我们可以使用 .filter
函数来实现此行为。
.filter((item, i, array) => array[i - 1] == item || item == array[i + 1])
let case1 = ['green', 'red', 'red', 'blue', 'green', 'green', 'green'];
let case2 = ['blue', 'blue', 'green', 'yellow', 'blue', 'orange', 'green', 'green', 'green', 'green'];
let case3 = ['purple', 'blue', 'blue', 'blue', 'red'];
let result1 = case1.filter((item, i, array) => array[i - 1] == item || item == array[i + 1])
let result2 = case2.filter((item, i, array) => array[i - 1] == item || item == array[i + 1])
let result3 = case3.filter((item, i, array) => array[i - 1] == item || item == array[i + 1])
console.log(result1)
console.log(result2)
console.log(result3)
javascript 中的越界索引将 return undefined
在您的比较中 false
我正在为我的爱好任务寻找算法。
例如我们有测试数据案例:
var case1 = ['green', 'red', 'red', 'blue', 'green', 'green', 'green'];
var case2 = ['blue', 'blue', 'green', 'yellow', 'blue', 'orange', 'green', 'green', 'green', 'green'];
var case3 = ['purple', 'blue', 'blue', 'blue', 'red'];
输出:
var result1 = ['red', 'red', 'green', 'green', 'green'];
var result2 = ['blue', 'blue', 'green', 'green', 'green', 'green'];
var result3 = ['blue', 'blue', 'blue'];
谁能告诉我应该使用哪种算法?重复的经典方式 - 不像我看的那样。
所以在 javascript 中,一个天真的实现是:
function selectSequential(source) {
var result = [];
for (let i = 0; i < source.length; i++) {
if ((i != source.length-1 && source[i+1] === source[i])
|| (i != 0 && source[i-1] === source[i])) {
result.push(source[i]);
}
}
return result;
}
简短版
我们可以使用 .filter
函数来实现此行为。
.filter((item, i, array) => array[i - 1] == item || item == array[i + 1])
let case1 = ['green', 'red', 'red', 'blue', 'green', 'green', 'green'];
let case2 = ['blue', 'blue', 'green', 'yellow', 'blue', 'orange', 'green', 'green', 'green', 'green'];
let case3 = ['purple', 'blue', 'blue', 'blue', 'red'];
let result1 = case1.filter((item, i, array) => array[i - 1] == item || item == array[i + 1])
let result2 = case2.filter((item, i, array) => array[i - 1] == item || item == array[i + 1])
let result3 = case3.filter((item, i, array) => array[i - 1] == item || item == array[i + 1])
console.log(result1)
console.log(result2)
console.log(result3)
javascript 中的越界索引将 return undefined
在您的比较中 false