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)検索に移行することができました。

この方法は、他のソリューションよりも一部のソリューションでうまく機能する可能性があり、他にも多くの考慮事項があることに注意してください。

これは、一意のプロパティでデータを検索するときに問題を解決する方法の1つにすぎません。

于 2014-10-19T19:15:37.307 に答える