2011-11-02 60 views
0

我有一个对象,看起来像:排序阵列使用对象和自定义排序逻辑的多个键

var object = [ 
    {"begin":0, "end":20}, 
    {"begin":30, "end":300}, 
    {"begin":40, "end":60}, 
    {"begin":40, "end":50}, 
    {"begin":80, "end":100}, 
    {"begin":80, "end":100}, 
    {"begin":350,"end":370} 
] 

我想遍历这个对象,并将其在下面的表格进行排序:

0 to 20 -> start here 
30 to 300 -> next smallest number from 20 is 30 
350 to 370 -> start from previous `end`, next number after 300 is 350. 

// now, since there is no larger number than 370, start loop again. 
40 to 60 -> start from 40 since this is the smallest unused number 
80 to 100 -> next unused smallest number from 60 is 80 

// now, since there is no larger unused number than 100, start loop again. 
40 to 50 
80 to 100 

要么返回相同的数组或新的数组会很好。

任何帮助总是赞赏。

+1

在第一排序子集,你为什么要挑'30具体300'? – Anurag

+0

很难说出你在问什么 – Joe

+0

@Auurag:因为从20开始的下一个最小的数字是30. – user1024718

回答

1

看到这里工作的例子:http://jsfiddle.net/bXNLT/2/

function sortItems(items) { 
    items = items.slice() // make a copy 
     // sort by "begin", in case the 
     // data isn't pre-sorted 
     .sort(function(a,b) { 
      return a.begin - b.begin; 
     }); 
    var sorted = [], 
     idx = 0, 
     item; 
    while (items.length) { 
     // move the current item into the sorted array 
     item = items.splice(idx, 1)[0]; 
     sorted.push(item); 
     // find next index 
     for (; idx<items.length; idx++) { 
      if (items[idx] && items[idx].begin > item.end) { 
       break; 
      } 
     } 
     // reset to 0 if we went too far 
     idx = idx < items.length ? idx : 0; 
    } 
    return sorted; 
} 

用法:

var arr = [ 
    {"begin":0, "end":20}, 
    {"begin":30, "end":300}, 
    {"begin":40, "end":60}, 
    {"begin":40, "end":50}, 
    {"begin":80, "end":100}, 
    {"begin":80, "end":100}, 
    {"begin":350,"end":370} 
]; 
sortItems(arr); // sorted as you specify 
-1

的Javascript阵列具有sort方法,其可以采取的比较函数作为参数:

var data = [...]; // your data here 
data.sort(function(a, b) { 
    // insert your logic here 
    // return values: 
    // -1 (a less than b) 
    // 0 (a equal to b) 
    // 1 (a greater than b) 
}); 

有此方法的on this site一些更多的例子。

+0

我不认为标准的sort()函数会满足OP的用例,它需要多次传递数据。 – nrabinowitz

+0

这不是一个解决方案/答案。这是一种可以使用的工具(可能属于评论),但甚至没有接近完整的答案。这个问题的主要部分是如何实现这种类型的自定义排序算法。 – jfriend00

0

对于你想要做的事情,正常的排序(即使用自定义函数)可能不会对整个事情起作用。

但是,您应该使用它来获取进一步处理的良好顺序的元素。先排序,然后排序。

然后,如果您为每个数据集添加一个“脏”标志,它变得更容易。

var obj = [ 
    {"begin":0, "end":20, "dirty": false}, 
    {"begin":30, "end":300, "dirty": false}, 
    {"begin":40, "end":60, "dirty": false}, 
    {"begin":40, "end":50, "dirty": false}, 
    {"begin":80, "end":100, "dirty": false}, 
    {"begin":80, "end":100, "dirty": false}, 
    {"begin":350,"end":370, "dirty": false} 
]; 

function getNextSet(arr) 
{ 
    var ret = []; 
    var lastEnd = -1; 

    for (var i = 0; i < arr.length; i++) 
    { 
    if (arr[i].begin >= lastEnd && arr[i].dirty == false) 
    { 
     ret.push(arr[i]); 
     arr[i].dirty = true; 
     lastEnd = arr[i].end; 
    } 
    } 

    return ret; 
} 

// do custom sorting as mentioned in the other answer to get in a good starting state 

var set = []; 
do { 
    set = getNextSet(obj); 
    // do whatever 
} while (set.length != 0); 
+0

'ret.append()'应该是'ret.push()'。但即使有了这个修复,我最终得到了'set == []' - 可能“做任何事情”这一行需要更多的解释:) – nrabinowitz

+0

这就是你使用集合中的数据的地方。 while循环集合总是[] - 这就是循环知道列表中没有更多项目需要处理。 – evan