微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从两个值中过滤数组作为边界条件

如何解决如何从两个值中过滤数组作为边界条件

我有一个像下面这样的数组

const num = [1,2,3,4,5,6,7];

和边界条件值,

var first = 6
var second = 3

预期输出现在基于此如下所示,

[6,7,1,3]

解释:

结果应该结合 2 个数组:

  1. >= first 在左边 [6,7]
  2. <= 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 个数组:

  1. >= first 在左边 [6,7]
  2. <= 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 举报,一经查实,本站将立刻删除。