Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用范围组合两个数组_Javascript_Arrays - Fatal编程技术网

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语句,结果变得很笨拙。所以那没用。我正在尝试另一种方法。我很快就会把它寄出去。谢谢你,你的问题没有多大意义,你能再详细解释一下吗?也请阅读和阅读。如果您不向我们显示任何代码,您希望我们如何帮助您解决问题?这太棒了。正是我需要的。非常感谢。