Javascript:循环数组.如果找到匹配项,则推送到数组,如果没有,则创建新的innerarray
Javascript : looping array of arrays. If match found, push to array, if not, create new innerarray
我正在从数据库中检索信息。数据看起来是这样的(我已经简化了它):
var example = [
{'start': 1966, 'end': 1970},
{'start': 1969, 'end': 1971},
{'start': 1972, 'end': 1980},
{'start': 1974, 'end': 1985},
{'start': 1975, 'end': 1979},
{'start': 1986, 'end': 1990},
{'start': 1991, 'end': 1995}
];
我想做的是将其动态排序为一个新的空数组newArr
。当排序完成时,newArr
应该看起来像
var newArr = [
[
{'start': 1966, 'end': 1970},
{'start': 1972, 'end': 1980},
{'start': 1986, 'end': 1990},
{'start': 1991, 'end': 1995}
],
[
{'start': 1969, 'end': 1971},
{'start': 1974, 'end': 1985}
],
[
{'start': 1975, 'end': 1979}
]];
我是javascript新手。我之所以选择数组和对象的组合,是因为我使用的是JSON数据,其中对象的顺序是重要的
我想做什么和尝试了什么
我正在尝试将主数组的不同键上的对象分组(newArr[0],newArr[1]等我想遍历example
,并将对象放在某个键上。如果在示例的迭代中,属性end
低于此时newArr上的属性,则存在重叠,并且应该制作新的数组。否则,它应该被推到主数组键中没有重叠的地方。我试着用以下三个功能来做这件事
var newArr = [];
function _overlap(){
// place first object
var addFirst = [example[0]];
newArr.push(addFirst);
// place others, therefore start with i = 1;
for (var i = 1 ; i < example.length ; i++){
_checkOverlap(example[i]);
}
}
_overlap();
function _checkOverlap(input){
// traverse the main array newArr, example[i] is passed as argument input
loopJ:{
for (var j = 0; j < newArr.length; j++){
// compare value of input.start (so example[i]) with last key of inner array
var innerArrayLength = newArr[j].length; // I need this to get the last key: length -1
if (input.start > newArr[j][innerArrayLength-1].end ){
newArr[j].push(input);
console.log(newArr);
break loopJ;
} else {
_createNewArr(input);
break loopJ;
}
}
}
}
function _createNewArr(input){
var toBeAdded = [];
toBeAdded.push(input);
newArr.push(toBeAdded);
}
这段代码在第一个键newArr0上执行了我想要的操作,但从未推入其他键。在这种情况下,我应该使用递归吗?我尝试了很多东西,但由于无限循环导致的浏览器崩溃数量让我抓狂。
如果我理解正确,对于example
的每个条目,您必须搜索newArr
中可以添加该条目的第一组。如果找到该组,请添加条目并迭代下一个条目。如果找不到该组,只需在最后创建一个新组即可。
var newArr = [];
outerloop:
for(var entry of example) {
for(var group of newArr)
if(group[group.length-1].end < entry.start) {
group.push(entry);
continue outerloop;
}
newArr.push([entry]);
}
为什么不在arr.sort
中使用比较器函数
var example = [
{'start': 1966, 'end': 1970},
{'start': 1969, 'end': 1971},
{'start': 1972, 'end': 1980},
{'start': 1974, 'end': 1985},
{'start': 1975, 'end': 1979},
{'start': 1986, 'end': 1990},
{'start': 1991, 'end': 1995}
];
//sorting using comparator function
example.sort(function(a,b){return a.start-b.start}) //will sort on start date
相关文章:
- 创建一个数组数组,没有任何重复的Javascript
- 为什么我的数组长度没有增加
- 敲除可观察数组并没有更新从数组中移除元素的视图
- MD 数组:如果未找到值,则添加其他数组
- JavaScript 头和尾在数组上没有突变
- 返回在数组中没有重复项的唯一元素
- 想知道为什么我的JQuery数组循环没有设置我的href's正确
- 第一个100个素数javascript,为什么在我的素数数组之后没有定义
- Rethinkdb追加到数组如果存在
- 过滤淘汰可观察数组时没有数据存在
- 迭代数组到数组,没有重复项
- 对于数组有没有更简单的解决方案
- 新的数组属性没有添加到javascript对象中
- Do数组默认没有原型
- 数组值没有传递给插件
- 为什么表单提交后$_POST数组中没有来自select控件的选中元素的值
- Javascript:循环数组.如果找到匹配项,则推送到数组,如果没有,则创建新的innerarray
- javascript回调后数组中没有项
- javascript数组长度没有显示在我的控制台日志中
- Javascript字符串到数组(如果字符串没有任何空格)