2

我有一个这样的数组:

employees = [
        {
        "id": 1,
        "shift_id": 1,
        "days": {
            "2012-03-01": 1,
            "2012-03-02": 1,
            "2012-03-03": 1,
            "2012-03-04": 0,
            "2012-03-05": 0,
            "2012-03-06": 0
        }},
    {
        "id": 2,
        "shift_id": 1,
        "days": {
            "2012-03-01": 0,
            "2012-03-02": 1,
            "2012-03-03": 1,
            "2012-03-04": 1,
            "2012-03-05": 1,
            "2012-03-06": 0
        }},
    {
        "id": 3,
        "shift_id": 2,
        "days": {
            "2012-03-01": 0,
            "2012-03-02": 0,
            "2012-03-03": 1,
            "2012-03-04": 1,
            "2012-03-05": 1,
            "2012-03-06": 1
        }}

    ];

有没有办法使用 id 值访问这个数组中的元素?也许在 jquery 中?喜欢$(employees('id = 1');

4

8 回答 8

7

只需遍历您的数组并检查 id:

var yourId = 1;
for (var i = 0, len = employees.length; i < len; i++) {
  if (employees[i].id == yourId) {
     // ...
  }
}
于 2012-10-15T08:09:58.307 回答
4

您可以使用这样的函数,它会适当地过滤数组:

var getEmployee = function (id) {
  return employees.filter(function(i) { return i.id == id; });
};
于 2012-10-15T08:15:53.623 回答
4

您可以使用此处.grep()记录的方法:

var employee = $.grep(employees, function(e) { return e.id == 1 })[0];
于 2012-10-15T08:17:31.347 回答
3

好吧,有一种 jQuery 方法可以做到这一点:

var findElementById = function(elements, id) {
  return $.grep(elements, function(e) { return e.id === id; })[0];
}

我仍然想知道为什么不直接索引源数组id

于 2012-10-15T08:14:02.783 回答
2

或这个:

$.each(employee, function(){
    if(this["id"] == 2){
        console.log(this);
    }
});
于 2012-10-15T08:08:26.090 回答
2

也许您正在寻找类似以下的内容:

$.grep(employees, function(n){return n.id==1});
于 2012-10-15T08:15:43.047 回答
1

据我所知,为了实现这一点,您必须遍历它们

 Array.prototype.getObjectById = function(x){
      var catcher = false, i = 0;
      while(!catcher){
        catcher = this[i].id == x ? this[i] : false;
        i++;
      }
      return catcher;
    }

这个功能应该有帮助。它将扩展数组对象,因此您可以将其用作myArray.getObjectbyId(id);

按照设计,这将返回第一个满足条件的对象。你可以像这样扩展它:

Array.prototype.getObjectsById = function(x){
  var catcher = [], i = 0;
  for(var i = 0; i < this.length; i++){
    if(this[i].id == value){
      catcher.push(this[i]);
    }
    i++;
  }
  return catcher.length == 1 ? catcher[0] : catcher;
}

如果多个对象与条件匹配,这将返回一组对象。

 Array.prototype.getObjectsByAttribute = function(x, criteria){
      if(!criteria){criteria = 'id';}
      var catcher = [], i = 0;
      for(var i = 0; i < this.length; i++){
        if(this[i].criteria == value){
         catcher.push(this[i]);
        }
        i++;
      }
      return catcher.length == 1 ? catcher[0] : catcher;
    }

这进一步扩展它以寻找任何标准。

于 2012-10-15T08:12:46.637 回答
1

我知道这个问题很老,但如果其他人偶然发现这个问题,供将来参考......

与其尝试过度设计函数来解析/检查 JSON,不如考虑更改数据结构以适应其目的。

考虑问题中的示例:

 data =  [ {
    "id": 1,
    "shift_id": 1,
    "days": {
        "2012-03-01": 1,
        "2012-03-02": 1,
        "2012-03-03": 1,
        "2012-03-04": 0,
        "2012-03-05": 0,
        "2012-03-06": 0
    }}, { .. }, {...} ]

以这种方式构建数据只能让您按顺序访问对象,而无法通过特定索引查找对象。在这种情况下,数组索引通常没有意义。

data[0] => { id : 1, .. }
data[1] => { id : 2, .. }

如果 id 是非连续的或字母数字的会发生什么?

使用数组不会帮助您更快地搜索,您仍然需要循环......

而是考虑使用哈希表/对象:

{
'id1' =>  { id : 1 , data : { ... } }, 
'id99' => { id : 99, data : { ... } },
'id2' =>  { id : 2 , data : { ... } },
}

您可以使用字符串值作为键,并通过执行以下操作直接访问数据:

 data['id2'] => { id : 2, ... }

这将使您可以直接访问要查找的数据(通过 id)。通过简单地重新组织数据的结构,我们能够从 O(n) 搜索变为 O(1) 搜索。

请记住,对于某些解决方案,此方法可能比其他解决方案效果更好,并且还有许多其他考虑因素需要考虑。

当您想通过唯一属性查找数据时,这只是解决问题的一种方法。

于 2014-10-19T19:15:37.307 回答