【问题标题】:Streamline random-order jQuery functions简化随机顺序的 jQuery 函数
【发布时间】:2012-03-20 09:31:30
【问题描述】:

冒险进入随机排序的世界,但在组合某些功能以尽可能高效时遇到了麻烦。 一切正常,但我觉得我正在以一种新手的方式进行操作,因为我使用我在 Stack Overflow 上找到的两个函数构建了它,我对其进行了修改,然后将它们组合在一起。 p>

我希望您能提出任何可以简化代码以提高效率并消除冗余的方法。

这个函数需要 10 个 div,将它们重新排列成随机顺序,然后以随机顺序一个接一个地将该随机顺序淡入页面。效果很整齐,看这里:http://jsfiddle.net/danielredwood/MgFj2/

非常感谢您的帮助!

__ 页面初始化函数

$(document).ready(function(){
    shuffle();
});

__ 为淡入淡出顺序创建数组

function introfade(x) {
    var o = [];
    for (var i = 0; i < x; i++) {
        var n = Math.floor(Math.random()*x);
        if ( $.inArray(n, o) > 0 ) {
            --i;
        } else {
            o.push(n);
        }
    }
    return o;
}

__重新排列 div 并将它们淡入

function shuffle() {
    var b       = $('.box'),
        arrange = $('<div>'),
        size    = b.size(),
        fade    = introfade(size);

    while (size >= 1) {
        var rand = Math.floor(Math.random() * size),
            temp = b.get(rand);

        arrange.append(temp);
        b = b.not(temp);
        size--;
    }

    $('.main').html(arrange.html());

    $('.box').each(function(i) {
        var c = $(this);
        setTimeout(function() {
            c.fadeTo(500, 1);
        }, fade[i]*150);
    });
}

【问题讨论】:

  • +1 用于将“弗兰肯斯坦”用作动词。
  • +1 表示“一切正常,但是”
  • 我知道这与您的问题或解决方案无关,但您应该将一些变量重命名为有意义的名称和/或添加一些 cmets,以便未来的开发人员必须维护/扩展它。
  • 很好,很抱歉。注意!

标签: javascript jquery css random fade


【解决方案1】:

为了好玩,我会在这里抛出另一个答案......你可以用相当少量的 jQuery 做到这一点:

// Rearrange divs and fade them in
function shuffle() {
    var num = $('.box').length - 1;
    $('.box').each(function(i) {
        var rand = Math.floor(Math.random() * num);
        $(this).remove().insertAfter($('.box').eq(rand)).delay(i * 50).fadeTo(250, 1);
    });
}

// Initialize function
$(document).ready(function() {
    shuffle();
});

http://jsfiddle.net/gvjrr/

这就是全部。这略有不同,因为它会按顺序淡化 div(但它们会在页面周围随机播放)。如果您想继续随机淡入它们,您只需先将它们洗牌而不显示,然后再洗牌并显示:

// Rearrange divs and fade them in
function shuffle() {
    var num = $('.box').length-1;

    $('.box').each(function(i) {
        var rand = Math.floor(Math.random() * num);
        $(this).remove().insertAfter($('.box').eq(rand));
    })

    $('.box').each(function(i) {
        var rand = Math.floor(Math.random() * num);
        $(this).remove().insertAfter($('.box').eq(rand)).delay(i * 50).fadeTo(250, 1);
    });
}

// Initialize function
$(document).ready(function() {
    shuffle();

});

http://jsfiddle.net/AapCP/1/

你可以进一步简化这个。

【讨论】:

    【解决方案2】:

    我一直在对这类事情使用“由内而外”算法。这是我的实现:

    /** pushRand
    
        Insert a value into an array at a random index. The element 
        previously at that index will be pushed back onto the end. 
    
        @see http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#The_.22inside-out.22_algorithm
    
        @param {Array} array Array to insert into.
        @param {Mixed} value Value to insert.
        @param {Object} rng Optional RNG. Defaults to Math.
        @return {Number} The new length of the array.
    
    */
    function pushRand (array, value, rng) {
        var j = (rng || Math).random() * (array.length + 1) | 0;
        array.push(array[j]);
        array[j] = value;
        return array.length;
    }
    

    使用这个,你的代码可以简化一点:

    // Create array for fade order
    
    function introfade(x) {
        var o = [];
        while (x--) pushRand(o, x);
        return o;
    }
    
    // Rearrange divs and fade them in
    
    function shuffle() {
        var b       = $('.box'),
            main    = $('.main')[0],
            arrange = $('<div>'),
            size    = b.size(),
            fade    = introfade(size),
            boxes   = [], 
            i;
    
        for (i = size; i--;) pushRand(boxes, b[i]);
        for (i = size; i--;) main.appendChild(boxes[i]);
    
        b.each(function(i) {
            var c = $(this);
            setTimeout(function() {
                c.fadeTo(500, 1);
            }, fade[i]*150);
        });
    }
    

    看这里:http://jsfiddle.net/MgFj2/2/

    【讨论】:

    • Verrrry 很有趣,喜欢组合随机函数的方法。而且算法非常棒。
    • 这是一个非常酷、高效、轻量级的小算法。这是一个就地洗牌来补充它(“现代算法”实现) - jsfiddle.net/5kHLp
    【解决方案3】:

    我看到了一项优化。与其随机选择一个数字然后检查它是否在o 中,不如创建一个可能值的数组(a),然后将splice() 随机输出一个并将其附加到o。这种方式总是需要x 步骤。另一种方法可能需要两倍以上,尤其是当o 几乎已满时,您很有可能生成一个已经存在于o 中的数字,尤其是随着x 的大小增加。

    function introfade(x) {
        var o = [];
        var a = [];
        for(var i=0; i<x; i++) {
             a.push(i);           
        }
        for(var i=x; i>0; i--) {
            var n = Math.floor(Math.random()*i);
            o.push(a.splice(n,1)[0]);           
        }
    
        return o;
    }
    

    http://jsfiddle.net/8Jy8T/

    另一种方法是遍历数组并将条目与另一个随机条目交换:

    function introfade(x) {
        var o = [];
        for(var i=0; i<x; i++) {
             o.push(i);           
        }
        for(var i=0; i<x; i++) {
            var n = Math.floor(Math.random()*i);
            var tmp = o[n];
            o[n] = o[i];
            o[i] = tmp;      
        }
    
        return o;
    }
    

    【讨论】:

    • 老实说,杰夫,这两个显然都比我做的更好。你有推荐吗?我理解 1 背后的概念,但不是 2
    • 2 只是简单地浏览一个数字列表o,并且每个数字都随机与另一个数字交换。
    • 知道了。抱歉,我接受了 GGG 的回答;感谢他将随机函数组合到排序和褪色中。你的帮助是无价的。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 2019-04-04
    相关资源
    最近更新 更多