jquery JavaScript关联数组按键值访问

qv7cva1a  于 2022-11-03  发布在  jQuery
关注(0)|答案(9)|浏览(138)

我有一个这样的数组:

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');

gcmastyq

gcmastyq1#

只需遍历数组并检查id:

var yourId = 1;
for (var i = 0, len = employees.length; i < len; i++) {
  if (employees[i].id == yourId) {
     // ...
  }
}
lf3rwulv

lf3rwulv2#

您可以使用类似以下的函数,适当地筛选数组:

var getEmployee = function (id) {
  return employees.filter(function(i) { return i.id == id; });
};
3j86kqsm

3j86kqsm3#

你可以用.grep()方法记载here

var employee = $.grep(employees, function(e) { return e.id == 1 })[0];
r1zhe5dt

r1zhe5dt4#

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

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

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

5kgi1eie

5kgi1eie5#

也许你正在寻找类似下面的东西:

$.grep(employees, function(n){return n.id==1});
z9zf31ra

z9zf31ra6#

或者这样:

$.each(employee, function(){
    if(this["id"] == 2){
        console.log(this);
    }
});
s4chpxco

s4chpxco7#

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

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;
    }

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

hmae6n7t

hmae6n7t8#

我知道这个问题已经很老了,但为了将来的参考,如果还有人偶然发现这个问题...
与其试图过度设计一个函数来解析/检查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, ... }

如果你想找到的数据是O(n)的,给予你可以直接访问这些数据,通过重新组织数据的结构,我们就可以从O(n)的搜索变成O(1)的搜索。
请记住,此方法可能对某些解决方案比其他解决方案更有效,并且还有许多其他注意事项需要考虑。
这只是解决您想要依唯一性质查阅数据时问题的一种方法。

zzlelutf

zzlelutf9#

公认的答案是伟大的-修改了一点AngularJS应用程序:

$rootScope.getObjectsByAttribute = function(inarry,infldnm,infldval){
    // This will iterate through a fetchAll sql result set and return rows where fldnm==fldval
    // If it finds 1 row it returns a single object, if more than that it returns an array of objects
    // Usage: result = $rootScope.getObjectsByAttribute(myarray,'myfldnm',myfldval);
    if(!infldnm){infldnm = 'id';}
    var catcher = [], i = 0;
    for(i = 0; i < inarry.length; i++){
      if(inarry[i][infldnm] == infldval){
        catcher.push(inarry[i]);
      }
    }
    return catcher.length == 1 ? catcher[0] : catcher;
  }

相关问题