我有一个排序的对象数组,每个对象都有开始和结束坐标,相对于包含所有这些坐标的更大范围声明。我想创建新的对象并将它们放入数组中。
JsFiddle链接位于底部
这是一个视觉表示:
之前:
|---------------------------------------|
|-----| |----------| |------|
之后:
|---------------------------------------|
|---|-----|-----|----------|---|------|-|
我试图使用for循环来查找丢失的范围,然后在找到它们时拼接到适当的对象中。这将创建一个无限循环。
我认为我可以用填充的对象创建一个临时数组,然后将其与原始数组连接起来,并按起始坐标排序,但我希望这样做不必再次对数组进行排序。
这里有一个指向jsFiddle的链接
我认为你的问题是,你正在使用splice来"修改"subfeatures[]
数组,(添加一个新元素),但同时你正在该数组上循环,这会导致无限循环,我认为您的逻辑很好,与其使用splice,不如只构建一个新的数组
注释行是你必须做的唯一修改。(你还必须考虑最后一个元素是否不在上限处结束)
//var newArr=[];
for (i = 0; i < subfeatures.length - 1; i++) {
//newArr.push(subfeatures[i]);
if ( subfeatures[i].end != subfeatures[i+1].start) {
var feat = {start: subfeatures[i].end, end: subfeatures[i+1].start, type: null};
console.log("A feature should be placed after the current index: "+i+". This feature would have the starting point: "+subfeatures[i].end+" and the ending point: "+subfeatures[i+1].start);
//newArr.push(feat);
}
}
//return newArr;
拼接()不是最优的,因为每次找到间隙时都必须移动数组中所有后面的元素。以下是Kossel建议的新阵列的解决方案:
var newArray = [];
for (i = 0; i < subfeatures.length - 1; i++) {
newArray.push(subfeatures[i]);
if ( subfeatures[i].end != subfeatures[i+1].start) {
var feat = {start: subfeatures[i].end, end: subfeatures[i+1].start, type: null};
newArray.push(feat);
}
}