Javascript 在jQuery中合并包含数据范围的2个数组

Javascript 在jQuery中合并包含数据范围的2个数组,javascript,jquery,arrays,range,Javascript,Jquery,Arrays,Range,是否可以在jQuery中按数据范围合并2个数组? 数组的长度可以不同 阵列1: [{"start":0,"end":15},{"start":20,"end":25},{"start":50,"end":120}] 阵列2: [{"start":0,"end":5},{"start":10,"end":22},{"start":45,"end":100}] 最后一个数组应该如下所示: [{"start":0,"end":25},{"start":45,"end":120}] 请帮忙。 Th

是否可以在jQuery中按数据范围合并2个数组?
数组的长度可以不同

阵列1:

[{"start":0,"end":15},{"start":20,"end":25},{"start":50,"end":120}]
阵列2:

[{"start":0,"end":5},{"start":10,"end":22},{"start":45,"end":100}]
最后一个数组应该如下所示:

[{"start":0,"end":25},{"start":45,"end":120}]
请帮忙。

Thx.

这里有一个相当强力的解决方案。这只适用于非负整数值(因为我依赖数组索引来跟踪“开始”和“结束”值),但它将接受任意数量、任意长度、任意顺序的输入数组。代码段中的注释解释了其工作原理:

//这个。。。运算符是我在这里使用的唯一ES6语法;
//这样fn就可以接受任意数量的输入数组。如果
//你不在乎这一点,也不会从ES6传输
//只需连接两个输入,即可创建“inputRange”:
var doMerge=函数(…输入){
//我们不在乎哪个输入来自哪个数组,
//因此,只需将它们全部合并:
var inputranges=[].concat(…输入);
//这将最终为其中的每个索引包含1
//a开始/结束范围:
var为WithinRange=[];
//填写“isWithinRange”:
for(输入范围的var范围){

对于(var i=range.start;i这是一个相当暴力的解决方案。这只适用于非负整数值(因为我依赖数组索引来跟踪“start”和“end”值),但它将接受任意数量、任意长度、任意顺序的输入数组。代码段中的注释解释了它的工作原理:

//运算符是我在这里使用的唯一ES6语法;
//这样fn就可以接受任意数量的输入数组
//你不在乎这一点,也不会从ES6传输
//只需连接两个输入,即可创建“inputRange”:
var doMerge=函数(…输入){
//我们不在乎哪个输入来自哪个数组,
//因此,只需将它们全部合并:
var inputranges=[].concat(…输入);
//这将最终为其中的每个索引包含1
//a开始/结束范围:
var为WithinRange=[];
//填写“isWithinRange”:
for(输入范围的var范围){
对于(var i=Rang.Engt;i在C++中已经被问及,我已经将算法移植到JavaScript:

  • 按起始值对范围进行排序
  • 从开始到结束对范围进行迭代,每当发现一个范围与下一个重叠时,就将其合并
函数合并(…输入){
输入=[].concat(…输入);
输入.排序((a,b)=>a.start>b.start);
让输出=[];
for(设i=0;i=input[i+1]。开始){
//当前范围与下一个范围重叠:合并它们
输入[i].end=Math.max(输入[i].end,输入[i+1].end);
//删除我们刚刚合并到当前范围中的范围
输入拼接(i+1,1);
//并将迭代器向后移动一个位置以保持
//它在下一次迭代中指向当前范围
我--;
}否则{
//当前范围与下一个范围不重叠,
//把它复制到结果中
输出推送(输入[i]);
}
}
返回输出;
}
让input1=[{“开始”:0,“结束”:15},{“开始”:20,“结束”:25},{“开始”:50,“结束”:120}];
让input2=[{“开始”:0,“结束”:5},{“开始”:10,“结束”:22},{“开始”:45,“结束”:100}];
控制台.log(合并(输入1,输入2));在C++中已经被要求:>P>,我已经将算法移植到JavaScript:

  • 按起始值对范围进行排序
  • 从开始到结束对范围进行迭代,每当发现一个范围与下一个重叠时,就将其合并
函数合并(…输入){
输入=[].concat(…输入);
输入.排序((a,b)=>a.start>b.start);
让输出=[];
for(设i=0;i=input[i+1]。开始){
//当前范围与下一个范围重叠:合并它们
输入[i].end=Math.max(输入[i].end,输入[i+1].end);
//删除我们刚刚合并到当前范围中的范围
输入拼接(i+1,1);
//并将迭代器向后移动一个位置以保持
//它在下一次迭代中指向当前范围
我--;
}否则{
//当前范围与下一个范围不重叠,
//把它复制到结果中
输出推送(输入[i]);
}
}
返回输出;
}
让input1=[{“开始”:0,“结束”:15},{“开始”:20,“结束”:25},{“开始”:50,“结束”:120}];
让input2=[{“开始”:0,“结束”:5},{“开始”:10,“结束”:22},{“开始”:45,“结束”:100}];

日志(合并(input1,input2))
这当然是可能的,但你需要展示自己解决这个问题的尝试,并更好地解释合并背后的逻辑。例如,为什么合并后的示例中
end
变成
200
?RoryMcCrossan这是一个打字错误。我已经编辑过了。根本不清楚输入和输出之间的关系看起来像什么e output是输入数组的总范围(输出的开始和结束范围包括任何输入中任何开始/结束范围内的所有内容,忽略重叠。)@AdrianChicu是“开始”和“结束”始终是整数值?@DanielBeck是的,只有整数。这当然是可能的,但你需要展示自己解决这一问题的尝试,并更好地解释合并背后的逻辑。例如,为什么合并后的示例中
end
变成
200
?RoryMcCrossan这是一个打字错误。我已经编辑过了。根本不清楚两者之间的关系在这里输入和输出之间看起来输出是来自输入数组的总和范围(输出的开始和结束范围包括任何输入中任何开始/结束范围内的所有内容,忽略重叠。)@AdrianChicu是“开始”和“结束”总是整数值?@DanielBeck是的,只有整数。这完全满足了我的要求。Thx Daniel。这完全满足了我的要求。Thx Daniel。很好!这比我的方法好多了。一个nitp