在数组中混杂连续相同的项目,使输出数组没有连续值。 JavaScript的

时间:2015-09-19 11:43:54

标签: javascript arrays sorting grouping

它的想法基本上没有具有相似值的数组中的重复值。

示例数组包含值

input = [1,2,2,2,2,3,4,5,6,7,8,9]<br/>

预期输出有一些东西

likeoutput = [1,2,3,2,4,2,5,2,6,2,7,8,9]<br/>

我已经尝试将它放在for循环中,并检查下一个项目,如果它是相同的,则交换值。问题是当我有连续的相似值时。

2 个答案:

答案 0 :(得分:5)

此提案的功能

  • 元素数量并将其存储在适当的对象中,
  • 检查是否可以传播(例如,不在此[1, 1, 1, 1, 3, 3]),
  • 循环使用元素,所以
  • 相同元素之间的最大距离。
  

它是如何运作的?

     

作为示例,我采用这个数组:[1, 2, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9]

     
      
  1. 使用元素的数量构建一个对象,并将该元素作为键存储。

    length = {
          "1": 1, "2": 4, "3": 1, "4": 1, "5": 1, "6": 1, "7": 1, "8": 1, "9": 1
      }
    
  2.   
  3. 选择值最大的属性:length[2] = 4
  4.   
  5. 使用前一个值的长度创建一个新数组,并用空数组填充它。

    output = [[], [], [], [], []]
    
  6.   
  7. 检查是否可以使用扩展阵列。如果没有,请返回。
  8.   
  9. k设置为属性最大值的键。

    k = '2'
    
  10.   
  11. 如果真的,继续。否则请转到11。
  12.   
  13. l设置为length[k]的值。

    l = 4
    
  14.   
  15. 遍历l并将k推送到索引为i % outputLength的数组末尾。增加i
  16.   
  17. 删除属性k
  18.   
  19. 继续进行5.
  20.   
  21. 返回平面output数组。

    output   first  then continued
    array 0:     2     1     6
    array 1:     2     3     7
    array 2:     2     4     8
    array 3:     2     5     9
    
    return:      2  1  6  2  3  7  2  4  8  2  5  9
    distance     |        |        |        |       is equal  
    
  22.   

&#13;
&#13;
function spread(input) {

    function findMaxKey() {
        var max = 0, key;
        Object.keys(length).forEach(function (k) {
            if (length[k] > max) {
                max = length[k];
                key = k;
            }
        });
        return key;
    }

    var length = input.reduce(function (r, a) {
            r[a] = (r[a] || 0) + 1;
            return r;
        }, {}),
        i = 0, k = findMaxKey(), l,
        outputLength = length[k],
        output = Array.apply(Array, { length: outputLength }).map(function () { return []; });

    if (input.length - outputLength < outputLength - 1 ) {
        return; // no spread possible
    }
    while (k = findMaxKey()) {
        l = length[k];
        while (l--) {
            output[i % outputLength].push(k);
            i++;
        }
        delete length[k];
    }
    return output.reduce(function (r, a) { return r.concat(a) }, []);
}
console.log(spread([1, 2, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9]));
console.log(spread([1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2]));
console.log(spread([1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]));
console.log(spread([1, 1, 1, 1, 3, 3]));
console.log(spread([1, 1, 3]));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 1 :(得分:0)

也许这可以帮到你:

for(var i = 1; i < input.length; i++) {
    if(input[i-1] == input[i]) {
        var j = i;
        while(j < input.length && input[j] == input[i]) {
            j++;
        }
        var el = input[j];
        input[j] = input[i];
        input[i] = el;  
    }
}