javascript - 如何获取 Javascript 数组中某个对象之前的最后 N 个对象?

标签 javascript angularjs

我正在尝试用 Javascript 实现项目的无限加载。就像您在最喜欢的消息传递应用程序中滚动浏览消息时获得的效果一样。我有一个像这样的大数组(+1000 个对象):

var array = [
    { id : 1, text: "First"},
    { id : 2, text: "Second"},
    { id : 3, text: "Third"},
    { id : 4, text: "Forth"},
    { id : 5, text: "Fifth"},
    { id : 6, text: "Sixth"},
    { id : 7, text: "Seventh"},
    ...
];

现在我只想一次加载 10 个项目。例如,我只显示 ID 为 3039 的项目。现在用户想要查看 30 之前的项目。选择 ID 为 30 的对象之前的最后 10 个项目的最佳方法是什么?如前所述,数组的大小很大,因此性能在这里很重要。

编辑

上面的例子只是一个例子。我应该能够根据需要多次过滤我的数组 10 项。

我想要实现的是加载一个大数组,但不是一次加载所有数组。我想一次加载 10 个项目。我正在跟踪过滤后的数组中的第一个对象(例如 30),然后我想获取该特定对象之前的最后 10 个对象。

编辑 2

这是我的观点:

<div ng-repeat="message in messages" class="message-wrapper">
     // Show content of message 
</div>

现在我首先显示消息中的最后 10 个项目

$scope.init = function(){        
    var messages = Database.AllMessages(); // This function returns all my messages
    $scope.messages =  messages.length > 10 ? messages.slice(-10) : messages;        
}

现在假设此函数返回的项目是 Id 为 3039 的项目。用户向上滚动并希望查看 30 之前的消息。那么我如何过滤 AllMessages() 返回的整个数组以获取 30 消息之前的最后 10 个项目?

提前感谢您的任何见解。

最佳答案

您想尽可能高效地查询数据源。确保数组首先按 id 排序:

array.sort(function(a, b) {
  if (a.id === b.id) return 0;
  if (a.id > b.id) return 1;
  return -1;
});

然后,可以进行二分查找,找到你要查找的元素的索引:

var search = function(arr, val) {
    if (arr.length === 0) {
        return -1;
    }

    var max = arr.length - 1, min = 0;

    while (max !== min) {
        var index = Math.floor((max + min) / 2);

        if (arr[index].id === val) {
            return index;
        }
        else if (arr[index].id < val) {
            min = index;
        }
        else {
            max = index;
        }
    }
    return arr[index].id === val ? index : -1;
}

// find index of element with desired id.
var index = search(array, 30);

一旦我们知道索引,我们只需选择索引之前/之后的元素:

var rangeMin = index - 10; // Inclusive. 10 is the maximum number of elements you want to render.
var rangeMax = index; // Not inclusive.

if (rangeMin < 0) { rangeMin = 0; }
if (rangeMax > array.length) { rangeMax = array.length; }

var elementsToRender = array.slice(rangeMin, rangeMax);

elementsToRender 现在将包含您要呈现的所有元素。

关于javascript - 如何获取 Javascript 数组中某个对象之前的最后 N 个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33707894/

相关文章:

javascript - ng-click 与 Bootstrap 评级

javascript - 注入(inject) Angular 服务时运行相同的代码

javascript - 错误对象到字符串

javascript - 如何获取多行中的值

php - 使用 Google Analytics 统计图像中的用户访问次数

AngularJS 指令在元素完全加载之前运行

angularjs - Angular-Kendo 网格 - 服务器端分页

javascript - 在没有 SWFObject 的 IE6 中使用 jQuery 嵌入 YouTube 视频

javascript - 在 Javascript 中使用 Django JSON 响应对象

javascript - AngularJS - 将 Youtube 视频 url 从指令嵌入到脚本时出现问题