如何解决如何从两个值中过滤数组作为边界条件
const num = [1,2,3,4,5,6,7];
和边界条件值,
var first = 6
var second = 3
预期输出现在基于此如下所示,
[6,7,1,3]
解释:
结果应该结合 2 个数组:
-
>= first
在左边[6,7]
-
<= second
在右侧[1,3]
我尝试过类似下面的操作,但数组位置与我上面提到的不同。
const result = num.filter((n,p) => {
if(p >= num.indexOf(first)) {return n}
else if(p <= num.indexOf(second)) {return n}
});
console.log(result) // [1,7]
下面是另一种方法,但效率不高,因为我需要循环两次。
const num = [1,7];
var first = 6
var second = 3
var arr = []
num.forEach((n,p) => {
if(p >= num.indexOf(first)) {arr.push(n)}
});
num.forEach((n,p) => {
if(p <= num.indexOf(second)) {arr.push(n)}
});
console.log(arr) //[6,3]
有没有更好的方法来实现这一目标?
解决方法
var num = [1,2,3,4,5,6,7];
var first = 6;
var second = 3;
const res = [
...num.filter((n) => n >= first),...num.filter((n) => n <= second)
];
console.log(res); // [6,7,1,3]
更新:
循环一次:
var num = [1,7];
var first = 6;
var second = 3;
var left = [];
var right = [];
num.forEach((n) => {
if (n >= first) left.push(n);
if (n <= second) right.push(n);
});
const res = [...left,...right];
console.log(res); // [6,3]
,
您的要求似乎特别,至少可以说,但以下内容应该可以:
const arr=[1,7];
// looking at positions of elements:
const getSubArraysPos=(ar,m,n)=>[...ar,...ar].slice(m-1,ar.length+n);
console.log(getSubArraysPos(arr,3))
// looking at array values:
const getSubArraysVal=(ar,n)=>[].concat.call(...ar.reduce((a,c)=>{
if (m>n) { if(c>=m) a[0].push(c); else if (c<=n) a[1].push(c); }
else if(c>=m && c<=n) a[0].push(c);
return a },[[],[]]));
console.log("6,3:",getSubArraysPos(arr,3));
console.log("5,2:",getSubArraysVal(arr,2));
console.log("2,5:",5))
代码可能有点“简洁”,但我只是想使其尽可能“一行”。
,首先,我想澄清一下要求,结果应该结合 2 个数组:
-
>= first
在左边[6,7]
-
<= second
在右侧[1,3]
输出:1 & 2 = [6,3]
解决方案:
最简单的方法是使用 Array#reduce
并将结果初始化为像 {first:[],second: []}
这样的对象。之后,使用 spread
连接 2 个数组。
因此,您只需要 O(n)
时间复杂度。
const num = [1,7];
var first = 6,second = 3;
const result = num.reduce((acc,curr) => {
if(curr >= first) acc.first.push(curr);
if(curr <= second) acc.second.push(curr);
return acc;
},{first:[],second: []});
console.log([...result.first,...result.second]);
您使用 .filter
的初始解决方案大多有效,但 .filter
无法对数组重新排序。
找到第一个值的索引。使用它来切掉数组的末尾。找到第二个值。使用它来切掉数组的开头。连接两部分。
const secondIdx = num.indexOf(second);
const firstIdx = num.indexOf(first,second+1);
const results = num.slice(firstIdx).concat(num.slice(0,secondIdx+1));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。