2016-08-30 6 views
0

私たちはこの配列は、時間のある時点でオブジェクトJavaScript:for..inループを使わずに、idを指定してオブジェクトの配列からオブジェクトを取得する方法?

$.ajax(settings).done(function (response) { 

         for (var i in response.items[0].devices) 
         { 

          mRegions.push(
            { 
             id: response.items[0].devices[i].id, 
             name: response.items[0].devices[i].name, 
             description: response.items[0].devices[i].description, 
             uid: response.items[0].devices[i].beacon.iBeacon.uid, 
             major: response.items[0].devices[i].beacon.iBeacon.major, 
             minor: response.items[0].devices[i].beacon.iBeacon.minor, 

            }); 
         } 



    var myId = 'b1'; 

以下での人口を取得

var mRegions = []; 

配列を持っていると仮定しましょう、私は、そのIDのオブジェクトのこの配列からオブジェクトを取得する必要があります与えられたid(myID)と一致する

for ... inループなしでこれを達成する方法はありますか?

答えて

3

Array.prototype.find()browser compatibility sectionを必ずお読みください。

myRegions.find(region => region.id === myId) 

やレガシーバージョン

myRegions.find(function(r){return r.id === myId}) 

let myRegions = [{ 
 
    id: 'a1', 
 
    name: 'A 1' 
 
}, { 
 
    id: 'a2', 
 
    name: 'A 2' 
 
}, { 
 
    id: 'a3', 
 
    name: 'A 3' 
 
}, { 
 
    id: 'b1', 
 
    name: 'B 1' 
 
}, { 
 
    id: 'b2', 
 
    name: 'B 2' 
 
}]; 
 

 
let myId = 'b1'; 
 

 
let pre = document.createElement('pre'); 
 
pre.textContent = JSON.stringify(myRegions.find(region => region.id === myId), null, ' '); 
 
document.body.appendChild(pre);

+0

@Rajesh Arrow関数は簡単に変換され、OPにpolyfillが必要な場合は、リンクされたドキュメント〜https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findに1つあります。 #Polyfill – Phil

+0

私はpolyfillリンクが利用可能であることを知っていますが、OPがそれを認識していない場合は、直接使用してすべてのブラウザで動作すると予想し、IEで失敗するとpolyfillを探します。だからちょうどこれが起こることを見せつけてください – Rajesh

+1

@Rajesh私は、特にエラーが発生した場合、人々がドキュメントを読むことを期待することは不合理だとは思わない – Phil

1
let array = [ 
    {id: 1, name: 'Name1'}, 
    {id: 3, name: 'Name3'}, 
    {id: 5, name: 'Name5'}, 
    {id: 7, name: 'Name7'} 
]; 

let result = array.filter(function(obj) { 
    return obj.id === 5; 
}); 

@Philの回答から.find()機能も考えてください。

.filter定義:

フィルタ()メソッドが提供される機能によって実現 試験に合格するすべての要素を使用して新しい配列を作成します。

.find定義: 配列内の要素が与えられたテスト関数を満たす場合

find()メソッドは、配列内の値を返します。それ以外の場合は、未定義です が返されます。

+0

マイナーアップデート:せ結果= array.filter(関数(OBJ){ 戻りOBJを.id === 5; }); – RDX

+0

@RDXは私がちょうど2x '='を持っていることに気付かなかった。編集 – Andurit

1

それがオプションである場合は、配列のオブジェクトisteadを使用して、IDとしてキーを設定することができます。そして

var mRegions = {}; 

$.ajax(settings).done(function (response) { 
    for (var i in response.items[0].devices) { 
     mRegions[response.items[0].devices[i].id] = { 
      id: response.items[0].devices[i].id, 
      name: response.items[0].devices[i].name, 
      description: response.items[0].devices[i].description, 
      uid: response.items[0].devices[i].beacon.iBeacon.uid, 
      major: response.items[0].devices[i].beacon.iBeacon.major, 
      minor: response.items[0].devices[i].beacon.iBeacon.minor, 
     }; 
     } 
    }); 

以下の表記法を使用して値にアクセス:

var region = mRegions.theId 

または:

var myId = 123; 
var region = mRegions[myId]; 
関連する問題