Javascript 是否按属性值获取数组中的下一个对象? 背景

Javascript 是否按属性值获取数组中的下一个对象? 背景,javascript,jquery,Javascript,Jquery,我有一个对象(用户)数组,定义和设置如下: // object definition function Users() { this.Id = null; this.Name = null; this.FirstName = null; this.LastName = null; this.IsActive = null; this.Title = null; this.index = null; this.selected = null; } // objec

我有一个对象(用户)数组,定义和设置如下:

// object definition
function Users()
{
  this.Id = null;
  this.Name = null;
  this.FirstName = null;
  this.LastName = null;
  this.IsActive = null;
  this.Title = null;
  this.index = null;
  this.selected = null;
}

// object array
var AllUsers = [];

// ...
// an ajax call retrieves the Users and adds them to the AllUsers array
// ...
将每个用户的索引值设置为检索顺序。一旦检索到用户,就可以逐个选择他们,并将其从列表移动到页面上的表中。选择后,阵列中选定对象的
selected
属性设置为true

我正在使用grep返回所有选定的用户

var SelectedUsers = $.grep(AllUsers,function(obj){
  return obj["selected"] == true;
});
以下是返回的数据示例:

[ 
  Object { 
    Id="00540000001AbCdEFG", 
    Name="First Last1", 
    FirstName="First", 
    LastName="Last1", 
    Title="Title", 
    index=56, 
    selected=true 
  },
  Object { 
    Id="00540000001AbChIJK", 
    Name="First Last2", 
    FirstName="First", 
    LastName="Last2", 
    Title="Title", 
    index=12, 
    selected=true 
  },
  Object { 
    Id="00540000001AbClMNO", 
    Name="First Last3", 
    FirstName="First", 
    LastName="Last3", 
    Title="Title", 
    index=92, 
    selected=true 
  }
]
问题: 我希望能够通过页面浏览数据,要做到这一点,我需要能够通过索引获得下一个和上一个选定的用户。我该怎么做

例如,如果我在表中打开第一个选定的用户(索引=56),我如何获得具有下一个索引的用户(索引=92的第三个选定用户)


为什么不按索引对数组排序呢

allUsers.sort(function(a, b) {
    return(a.index - b.index);
});
然后,下一个选定的用户将是所选阵列中的下一个用户。您可以沿着阵列漫游,直到找到所选用户

或者,您可以使用grep函数获取所有选定的用户,然后按索引对其进行排序,以便下一个选定的用户就是selectedUsers数组中的下一个用户,如下所示:

var SelectedUsers = j$.grep(AllUsers,function(obj){
  return obj["selected"] == true;
}).sort(function(a, b) {
    return(a.index - b.index);
});
小提琴:

添加了JavaScript:

SelectedUsers.sort(function(a,b){
      return a.index == b.index ? 0 : (a.index < b.index ? -1 : 1)});

通过索引实现您自己的排序功能:

function compareUsers(a,b)
{
    return (a.index - b.index);
}
并对对象进行排序:

SelectedUsers.sort(compareUsers);

现在,所有索引的顺序都正确了。由此,可以很容易地通过索引号获得以下或之前的对象。

+1对于解释得很好的问题以及小提琴,似乎您必须对数组进行排序或重新排列,以满足您的需要;如果数组很小,它应该足够有效地遍历所有元素,以对它们进行不同的索引。@Mahn无需这样做,
sort()
函数就足够了。感谢OP.
$。grep对我来说是一个新的。
array.sort()
将数组排序到位。始终修改原始数组。请参阅此测试示例:sort始终修改数组,复制引用将无济于事。感谢@jfriend00和Bergi-修复了它。使用克隆数组可能会保留原始数组。为什么使用
返回a.index==b.index?0:(a.index
return(a.index-b.index)
更简单时?-1排序
alluser
不是没有必要的,因为他只需要对
所选的用户进行排序
@iambriansreed-我提供这两个选项,OP可以决定哪个更适合他们的需要。与每次执行grep相比,让主数组保持排序可能更容易-这取决于对其执行的其他操作以及主数组的其他用途。-1正如我在回答的评论中提醒的那样,您正在此处创建两个排序数组:
SortedUsers
SelectedUsers
@IAMBRIANSRED您完全正确,
sort()
直接在阵列上工作。我将修正我的答案,谢谢你指出。
SelectedUsers.sort(compareUsers);