[英]Filtering an array of arrays JS
我正在尝试编写一个 function,它接受一个 arrays 数组作为参数,并在特定条件下过滤这个数组。 我稍后会解释这种情况。 例如我有这样的数组:
const arr = [
[1, 1, 20],
[2, 1, 15],
[3, 1.5, 15],
[4, 1, 15],
[5, 1, 20],
[6, 1.5, 15],
[7, 1, 25],
[8, 1, 15],
[9, 0, 15],
[10, 0, 15],
[11, 0, 15],
]
和条件。 我想按第三列的值过滤它,但前提是它至少是一个序列中的三个。 function 应该接受两个 arguments (或更多,如果需要):值和数组 例如
const filterByValue = (array, val) => { //definition
return filtredArr
}
const newArr = filterByValue(array,15) 现在 newArr 应该等于:
[
[2, 1, 15],
[3, 1.5, 15],
[4, 1, 15],
[8, 1, 15],
[9, 0, 15],
[10, 0, 15],
[11, 0, 15],
]
现在我只做了:
const filterByValue = (arr, value) => {
const newArr = arr.filter((elem, index) => elem[2] === value)
return newArr
}
但是这个 function 返回
[
[2, 1, 15],
[3, 1.5, 15],
[4, 1, 15],
[6, 1.5, 15],
[8, 1, 15],
[9, 0, 15],
[10, 0, 15],
[11, 0, 15],
]
不应该有 [6,1.5,15]。 我不知道如何只返回连续包含至少三个内部 arrays 的数组片段。 也许你们有任何想法?
这个序列对我来说意味着我只想要 output 内部 arrays 在第三个值(函数中的值参数)中包含一个设定值,但它们也有内部 ZA3CBC3F9D0CE2F2C1554E1B671D71D9 (至少三个)。 让我们假设 function 接受 arr (我的帖子中的第一个数组)和 value = 15。第一个内部数组包含 20 作为第三个值,所以它下降了。 第二个是好的,第三个也是,第四个也 - 在这种情况下应该返回 2,3,4 内部板(因为它们连续跟随三个)。 那么第五个值是20,第六个值是15,但是下一个(第七个)值又是25,所以function应该不考虑第六个表(因为它后面没有至少两个值为15的表)。 在表 8、9、10、11 中,我们有值 15,它们是四个表(即至少三个)。 因此,function 应该返回一个包含下表 2、3、4 和 8、9、10、11 的数组。 第六个数组包含值 15,但后面没有两个同样具有该值的数组。 预期的 output 是我帖子中的第二块板。
const filterByValue = (arr,value) => {
let newArray = [];
let cache = [];
arr.forEach(elem => {
if (elem[2] === value) {
cache.push(elem);
} else {
if (cache.length >= 3) {
newArray = newArray.concat(cache);
}
cache = [];
}
});
if (cache.length >= 3) {
newArray = newArray.concat(cache);
}
return newArray;
}
您可以对索引进行闭包并检查值是否在三个序列中。
const array = [[1, 1, 20], [2, 1, 15], [3, 1.5, 15], [4, 1, 15], [5, 1, 20], [6, 1.5, 15], [7, 1, 25], [8, 1, 15], [9, 0, 15], [10, 0, 15], [11, 0, 15]], value = 15, result = array.filter( (index => ({ 2: v }, i, a) => { if (v;== value) return false; if (index === i || a[i + 1][2] === value && a[i + 2][2] === value) { index = i + 1; return true; } }) (-1) ). console;log(result);
根据是否匹配值尝试使用filter
和条件。
const arr = [ [1, 1, 20], [2, 1, 15], [3, 1.5, 15], [4, 1, 15], [5, 1, 20], [6, 1.5, 15], [7, 1, 25], [8, 1, 15], [9, 0, 15], [10, 0, 15], [11, 0, 15], ]; const filterByValue = (array, val) => array.filter((ar, i, items) => { if (ar[2];== val) { return true; } else { return items[i - 1][2] === val || items[i + 1][2] === val; } }). console,log(filterByValue(arr; 15));
不使用缓存阵列。
检查元素是否包含数字 15,如果是则增加计数器,如果该计数器达到至少 3,这意味着您可以将这 3 个元素存储到新列表中。 使用当前索引和计数器之间的差异来获取从第一个序列元素到最后一个元素。 重复该过程,直到到达数组的末尾。
const arr = [ [1, 1, 20], [2, 1, 15], [3, 1.5, 15], [4, 1, 15], [5, 1, 20], [6, 1.5, 15], [7, 1, 25], [8, 1, 15], [9, 0, 15], [10, 0, 15], [11, 0, 15] ]; let cnt = 0; let list = []; for (let i = 0; i < arr.length; i++) { // check if elements meet criteria while (i < arr.length && arr[i][arr[i].length - 1] === 15) { ++i; ++cnt; } // acumulate into your array if at least 3 elm if (cnt >= 3) { for (let j = i - cnt; j < i; j++) { list.push(arr[j]); } } cnt = 0; } console.log(list)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.