shuffle之后的Javascript / Angular返回数组

时间:2015-03-02 22:32:29

标签: javascript arrays angularjs shuffle

我正在构建一个Angular应用程序中创建一个简单的shuffle / unshuffle函数。想法是有一个按钮,点击它将克隆数组,洗牌数组,然后返回数组的洗牌顺序,或者如果数组已被洗牌,它将返回原始数组的克隆所以用户可以恢复原始订单。

我遇到的问题是我无法弄清楚如何将原始订单克隆返回到视图。

这是一个小提琴:http://jsfiddle.net/nf6j1qvz/

这是一些功能代码:

$scope.shuffleThis = function(array) {
    if(!$scope.isShuffled){
        $scope.isShuffled = true;
        $scope.unshuffled = array.slice(0);
        var m = array.length, t, i;
        // While there remain elements to shuffle
        while (m) {
            // Pick a remaining element…
            i = Math.floor(Math.random() * m--);
            // And swap it with the current element.
            t = array[m];
            array[m] = array[i];
            array[i] = t;
        }
        return array;
    }else{
        console.log('unshuffling');
        $scope.isShuffled = false;
        array = $scope.unshuffled;
        return array;
    }
}

2 个答案:

答案 0 :(得分:1)

您可以按如下方式更改ng-click

 <button ng-click="array = shuffleThis(array)">

你已经完成了!

Plunkr:

http://jsfiddle.net/grmqxx9e/

答案 1 :(得分:1)

使用angular.copy代替克隆数组。这是一个很深的副本,并且一直在为我使用的方法不可靠。

https://docs.angularjs.org/api/ng/function/angular.copy

var originalArray = [];
angular.copy(array, originalArray);
// Continue doing your stuffs

但是,你正在调用一个有返回的函数,所以你没有正确设置该变量。

您可以将ng-click更改为

ng-click='array = shuffleThis(array)'

或者代替

return array

在您的函数中,执行

$scope.array = array;

我会亲自做第二种方法。