Javascript:循环数组.如果找到匹配项,则推送到数组,如果没有,则创建新的innerarray

Javascript : looping array of arrays. If match found, push to array, if not, create new innerarray

本文关键字:数组 如果没有 创建 innerarray 循环 如果 Javascript      更新时间:2023-09-26

我正在从数据库中检索信息。数据看起来是这样的(我已经简化了它):

    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