Javascript 使用范围组合两个数组
我正在尝试合并两个数组。每个数组都有定义范围的子数组。我希望将其合并,以便创建的新数组反映基于两个数组中的值的新范围。例如:Javascript 使用范围组合两个数组,javascript,arrays,Javascript,Arrays,我正在尝试合并两个数组。每个数组都有定义范围的子数组。我希望将其合并,以便创建的新数组反映基于两个数组中的值的新范围。例如: //I would like to create a new array based on the ranges in a and b. var a = [[0, 20], [20, 40], [40, 70]]; var b = [[10, 25], [25, 35]] //The result reflects the new ranges based on val
//I would like to create a new array based on the ranges in a and b.
var a = [[0, 20], [20, 40], [40, 70]];
var b = [[10, 25], [25, 35]]
//The result reflects the new ranges based on values in both the arrays.
var result = [[0, 10], [10, 20], [20, 25], [25, 35], [35, 40], [40, 70]]
您可以收集对象中的所有值,对其进行排序并从中构建元组
var a=[[0,20],[20,40],[40,70],
b=[[10,25],[25,35],
values=Object.create(null),
结果=[];
a、 concat(b)、forEach(函数(a){
值[a[0]]=true;
值[a[1]]=true;
});
对象
.键(值)
.地图(编号)
.排序(功能(a、b){
返回a-b;
})
.减少(功能a、b){
结果:推送([a,b]);
返回b;
});
控制台日志(结果)代码>
.as console wrapper{max height:100%!important;top:0;}
此解决方案即使在范围不是完全有序且不重叠的情况下也有效
将两个列表合并为一个数组
将数组的数组展平为简单的数字数组
从数组中删除重复项(除了第一个和最后一个之外,每个数字都包含两次,因此我们需要修复该问题)
在展平和消除重复的阵列上循环
找到最小值的索引,然后从数组中删除该最小值
将该最小值添加到表示单个范围的“临时范围”
如果“temp_range”的长度现在是2,我们将其添加到最终的范围数组中,然后让temp_range从当前的最小值开始
var a=[[0,20],[20,40],[40,70];
变量b=[[10,15],[25,35]]
var组合=a.concat(b);
变平的var=合并的.reduce((a,b)=>a.concat(b),[]);
展平=展平。过滤器(功能(项目、位置){
返回。索引(项目)=位置;
});
var final_数组=[];
var temp_范围=[];
var minIdx=null;
var minVal=null;
while(展平长度){
minIdx=flatted.indexOf(Math.min(…flatted));
minVal=扁平拼接(minIdx,1)[0];
温度范围推送(最小值);
如果(温度范围长度==2){
最终阵列推送(温度范围);
温度范围=[minVal];
}
}
console.log(最终_数组);
虽然我喜欢发布的另一种功能性更强的方法,但我不喜欢它依赖于事物定义位置的副作用这一事实。这里有一个版本在这方面做了一些改进
var a=[[0,20]、[20,40]、[40,70];
VarB=[[10,25],[25,35];
//用于展平输入阵列的实用函数
var展平=函数展平(arr){
返回arr.reduce(函数(agg,arr){
返回聚合concat(Array.isArray(arr)?展平(arr):arr;
}, []);
};
//将所有内容合并成一个简单的数字列表
var c=变平(a.concat(b));
//从值中创建散列以获取唯一端点
var d=c.reduce(函数(agg,n){
agg[n]=真;
返回agg;
}, {});
//将散列减少到指定的范围
var[2;,e]=Object.keys(d).map(Number).reduce(函数([last,agg],n){
if(last==null)返回[n,agg];
总推力([最后,n]);
返回[n,agg];
},[null,[]);
控制台日志(e)代码>一种更通用的方法首先将串联的范围列表展平,然后对该范围索引列表进行排序和唯一变体,最后从中生成范围元组列表。因此,它不依赖于任何距离顺序和/或对距离-跨度碰撞不可知
函数展平(列表){//简化变量
if(Array.isArray(列表)){
list=list.reduce(函数(收集器,elm){
返回收集器.concat(flatten(elm));
}, []);
}
退货清单;
}
函数唯一(列表){//简化变量
变量i=-1,k,len=list.length,type;
而(++i=2){
collector.rangeList.push(元组);
collector.recentTuple=[rangeIndex];
}
回程收集器
},{recentTuple:[],rangeList:[]}。rangeList;
log('aRangeList:',aRangeList);
console.log('bRangeList:',bRangeList);
console.log('cRangeList:',cRangeList)代码>
。作为控制台包装{max height:100%!important;top:0;}
您可以发布您的代码吗?是否保证订购范围?是的,请发布您尝试的内容。是的。它们需要订购。我试着做一个switch-case语句,结果变得很笨拙。所以那没用。我正在尝试另一种方法。我很快就会把它寄出去。谢谢你,你的问题没有多大意义,你能再详细解释一下吗?也请阅读和阅读。如果您不向我们显示任何代码,您希望我们如何帮助您解决问题?这太棒了。正是我需要的。非常感谢。