2014-01-19 56 views
-2

我有分裂和组阵列的javascript/jquery的

range = [a,3,b,2,c,1,d,2,e,3,f,3] 

,需要组A,B,C,d,E,F为3个相同大小的组根据它们的值。

正确的结果将是:

group1 = [a] 
group2 = [b,c] 
group3 = [d,e,f] 

更新:模式 - >仅可以组3更大然后总的组的1/3。我迄今这样的:

var range = [3,2,1,2,3,3] 
var total = 14; 
var group_size = total/3; 
var values = [0]; 
var groupnr = 0; 
range = range.reverse(); 

while(range.length) { 
var curvalue = range.pop(); 

if(values[groupnr] + curvalue > group_size && groupnr < 2) { 
    groupnr++; 
    values[groupnr] = 0; 
} 
values[groupnr] += curvalue; 
} 
log(values); 
+3

告诉我们你到目前为止试过的东西 –

+4

我没有看到图案:( – thefourtheye

+0

更新了我的问题我到目前为止所做的以及模式 – user2843661

回答

0

这里的至少一种可能性:

var equalSplit = (function() { 
    var sum = function(list) {return list.reduce(function(a, b) { 
     return a + b; 
    }, 0);}; 
    var evens = function(list) { 
     return list.filter(function(item, index) {return !(index % 2);}) 
    }; 
    var odds = function(list) { 
     return list.filter(function(item, index) {return !!(index % 2);}) 
    }; 
    var split = function(values, count) { 
     var mean = sum(values)/values.length; 
     var groups = [], index = 0, total, groupStart; 
     for (var i = 0; i < count - 1; i++) { 
      total = 0; groupStart = index; 
      while (index < values.length && total < mean) { 
       total += values[index++]; 
      } 
      groups.push(values.slice(groupStart, index)); 
     } 
     groups.push(values.slice(index)); 
     return groups; 
    }; 
    var reconstituteRanges = function(ranges, splits) { 
     var groups = {}, ctr = 0, diff; 
     for (var i = 0; i < splits.length; i++) { 
      diff = splits[i].length 
      groups["group" + (i + 1)] = 
        (evens(ranges.slice(ctr, ctr+=(2 * diff)))); 
     } 
     return groups; 
    }; 
    return function(ranges, count) { 
     var values = odds(ranges); 
     var splits = split(values, count); 
     return reconstituteRanges(ranges, splits); 
    } 
}()); 

var ranges = ['a',3,'b',2,'c',1,'d',2,'e',3,'f',3]; 
console.log(equalSplit(ranges, 3)); 
//=> {"group1":["a"],"group2":["b","c"],"group3":["d","e","f"]} 

你可以看到它在行动上JSFiddle

这个问题比an earlier version简单得多,尽管代码并没有那么短。

但是,你真的想让最后一组携带所有重量吗?你最初发布的时候希望他们更接近平等。在这种情况下,你的加权总数是[3,3,8],相当高的16.67方差,其中[['a'],['b','c','d'],['e' 'f']]在[3,5,6]中平衡得更好,方差仅为4.67。这真的是你的要求,还是这只是一种编写简单代码的方式? (虽然这段代码并不比我前一篇的答案短得多,但实际上要简单得多)。

+0

谢谢Scott!这是我想找的东西。现在我将仔细检查您的早期版本,看看有什么符合我的最佳需求。我希望有人可能会发现我的问题和你的答案有帮助。做得好! – user2843661

1

喜欢的东西

var range = ['a',3,'b',2,'c',1,'d',2,'e',3,'f',3]; 
var obj = {}; 

range.map(function(el, i) { 
    if (i%2) { 
     var k = 'group'+el; 
     obj[k] = obj[k] || []; 
     obj[k].push(range[i-1]); 
    } 
}); 

给你

{ 
    "group1" : ["c"] 
    "group2" : ["b","d"], 
    "group3" : ["a","e","f"], 
} 

FIDDLE

这是关于将是有意义的唯一的事情?