如果我从0以外的任何东西开始,array.slice()不起作用

时间:2017-04-09 09:04:28

标签: javascript angularjs arrays pagination

我有一个名为$scope.results的数组中有8个对象的列表,我还有一个selectAll()函数,我正在尝试使用我的自定义简单分页。

请不要发表评论说我应该为angularjs使用bootstrap分页,我自己创建了它,它完成了我需要它做的事情。

$scope.results = [
      {
        "devID": "1",
        "devName": "item 1",
        "desc": "sample desc"
      },
      {
        "devID": "2",
        "devName": "item 2",
        "desc": "sample desc"
      },
      {
        "devID": "3",
        "devName": "item 3",
        "desc": "sample desc"
      },
      {
        "devID": "4",
        "devName": "item 4",
        "desc": "sample desc"
      },
      {
        "devID": "5",
        "devName": "item 5",
        "desc": "sample desc"
      },
      {
        "devID": "6",
        "devName": "item 6",
        "desc": "sample desc"
      },
      {
        "devID": "7",
        "devName": "item 7",
        "desc": "sample desc"
      },
      {
        "devID": "8",
        "devName": "item 8",
        "desc": "sample desc"
      }
    ];

我有一个名为$scope.deleteList = {}的空对象,selectAll()填充了ID。

这是我的$scope.selectAll()(添加了控制台日志,供我查看发生的事情):

    $scope.selectAll = function(){


        $scope.resultsToDelete = $scope.results.slice(($scope.currentPage * $scope.pageSize), $scope.pageSize);
        console.log("$scope.results:", $scope.results);
        console.log("$scope.currentPage:", $scope.currentPage);
        console.log("$scope.pageSize:", $scope.pageSize);
        console.log("$scope.currentPage * $scope.pageSize:", ($scope.currentPage * $scope.pageSize));


        for (var i = 0; i < $scope.resultsToDelete.length; i++) {
            var item = $scope.resultsToDelete[i]; 
            $scope.devDelList[item.devID] = true;
        }



    };

($scope.currentPage * $scope.pageSize)为我提供了列表下一页上第一个对象的索引。

这是我的分页:

    $scope.pagination = function(itemList) {
        $scope.currentPage = 0;
        $scope.pageSize = 4;
        $scope.numOfPages = Math.ceil(itemList.length / $scope.pageSize);
        $scope.pageNumbersArray = [];

        for (var i = 0; i <= $scope.numOfPages -1 ; i++) {
            $scope.pageNumbersArray.push(i);
        }
    }($scope.results)



$scope.prev = function() {
    if ($scope.currentPage > 0) {
        $scope.currentPage = -- $scope.currentPage;
    }
}

$scope.next = function() {
    if ($scope.currentPage < $scope.numOfPages - 1 ) {
        $scope.currentPage = ++ $scope.currentPage;
    }
}

$scope.goToPage = function(pageNum) {
    $scope.currentPage = pageNum;
}

我的问题在于结果数组中的.slice()。它只适用于第一页 - $scope.currentPage = 0时。只要$scope.currentPage = 1,$ scope.results.slice()就会返回一个空数组。

$ scope.results.slice(0,4)返回4个项目的第一页的正确ID。

$ scope.results.slice(4,4)返回一个空数组。 (例如[]),它不会返回第二组4项

我错过了什么?

4 个答案:

答案 0 :(得分:4)

  

$ scope.results.slice(4,4)返回一个空数组。 (例如[])

根据documentation

  

基于零的索引,在此之前结束提取。切片提取到   但不包括结束。

     

例如,切片(1,4)从第四个提取第二个元素   element(元素索引为1,2和3)。

因此,从 4 4 只能 0

你需要尝试

Math.pow(num,exponent).intValue()

答案 1 :(得分:1)

查看slice documentation

seconds参数不是长度,而是结束索引。

假设你有一个数组:

a = [1,2,3,4]

如果您想选择[3,4]

然后你必须用slice(2,4)而不是slice(2,2)

来切片

您应该将代码修改为:

res = $scope.results.slice(($scope.currentPage * $scope.pageSize),
    $scope.currentPage * $scope.pageSize + $scope.pageSize);

答案 2 :(得分:1)

<?php namespace App\Mail\User; use Illuminate\Bus\Queueable; use Illuminate\Database\Eloquent\Model; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; use App\Modules\User\User; class WelcomeEmail extends Mailable { use Queueable, SerializesModels; /** * @var Model */ public $user; /** * Create a new message instance. * @param User $user */ public function __construct(User $user) { $this->user = $user; } /** * Build the message. * * @return $this */ public function build() { return $this->markdown('emails.user.registered'); } } 将始终返回一个空数组。 anArray.slice(n, n)的参数是slice,其中(begin, end)是起始索引,begin是结束索引,而不是切片的长度。

在你的情况下,你会想要这样的东西:

end

答案 3 :(得分:1)

因为 Slice方法适用于基于零的索引 See documentation here

  

slice()方法返回数组部分的浅表副本   进入从头到尾选择的新数组对象(不包括结束)。

所以,对于var arr = [1,2,3,4];

  

begin:开始提取的从零开始的索引。

     

end:基于零的索引,在此之前结束提取。切片   提取但不包括结束。

所以对于例如。

arr.slice(1,3);

当我们说result is [2,3]时,它意味着从索引1到索引4的所有元素也会排除索引4处的值,因此arr.slice(1,1);

当我们说[]时它从索引1到索引1的所有元素都会排除索引1处的值,因此结果为empty array readLine < / p>