更好的检查数组中两项之间的方法

Better method for checking between two items in array

本文关键字:两项 方法 之间 检查 数组 更好      更新时间:2023-09-26

我有一个像这样的数组:

var data = [
    {
        "title" : "Title 1",
        "slideText" : "",
        "startTime" : 0
    },
    {
        "title" : "Title 2",
        "slideText" : "",
        "startTime" : 60
    },
    {
        "title" : "Title 3",
        "slideText" : "",
        "startTime" : 120
    }
];

我在HTML5视频上有一个seeked事件监听器。当用户搜索时,我需要检查他们在哪里,并确定他们在数组中的哪个索引上。例如,它们查找72秒,它们将在数组[1]

现在我有这个:

player.addEventListener("seeked", function(event)
{
    currentTime = player.currentTime;
    angular.forEach($scope.data, function(value, key)
    {
        if (currentTime >= $scope.data[key].startTime && currentTime <= $scope.data[key + 1].startTime)
        {
            $scope.$apply(function()
            {
                $scope.setActive(key);
            });
        }
    });
});

这一切都工作,直到寻找的时间到达数组的末尾,$scope.data[key + 1].time是未定义的。我该如何处理这个问题?我现在心不在焉,我还没喝咖啡:|

编辑

new function working

player.addEventListener("seeked", function(event)
{
    currentTime = player.currentTime;
    for (var i = 0; i <= $scope.data.length; i++)
    {
        if ($scope.data[i + 1] != undefined)
        {
            if (currentTime < $scope.data[i + 1].startTime)
            {
                $scope.$apply(function()
                {
                    $scope.setActive(i);
                });
                break;
            }
        }
        else
        {
            $scope.$apply(function()
            {
                $scope.setActive($scope.data.length - 1);
            });
        }
    }
}); 

首先测试数组元素是否存在。如果失败,其他测试将被忽略:

if ($scope.data[key+1] && currentTime>=$scope.data[key].startTime && currentTime<=$scope.data[key+1].startTime)

您需要检查[key + 1],以确保您不会尝试访问超出数组长度的元素。

player.addEventListener("seeked", function(event)
{
    currentTime = player.currentTime;
    angular.forEach($scope.data, function(value, key)
    {
        if ( ($scope.data[key+1] != undefined) && currentTime < $scope.data[key+1].startTime)
        {
           // this is the one we are after
           return false; // exit foreach
        } else {
          // we are on the last one.
        }
    });
});

这是最终的解决方案

player.addEventListener("seeked", function(event)
{
    currentTime = player.currentTime;
    for (var i = 0; i <= $scope.data.length; i++)
    {
        if ($scope.data[i + 1] != undefined)
        {
            if (currentTime < $scope.data[i + 1].startTime)
            {
                $scope.$apply(function()
                {
                    $scope.setActive(i);
                });
                break;
            }
        }
        else
        {
            $scope.$apply(function()
            {
                $scope.setActive(i - 1);
            });
        }
    }
});