回答:
次のfind()
方法を使用します。
myArray.find(x => x.id === '45').foo;
MDNから:
この
find()
メソッドは、配列の要素が指定されたテスト関数を満たす場合、配列の最初の値を返します。それ以外の場合undefined
は返されます。
代わりにそのインデックスを検索する場合は、次を使用しますfindIndex()
。
myArray.findIndex(x => x.id === '45');
MDNから:
この
findIndex()
メソッドは、指定されたテスト関数を満たす配列の最初の要素のインデックスを返します。それ以外の場合は-1が返されます。
一致する要素の配列を取得する場合は、filter()
代わりにメソッドを使用します。
myArray.filter(x => x.id === '45');
これはオブジェクトの配列を返します。foo
プロパティの配列を取得したい場合は、次のmap()
メソッドを使用してこれを行うことができます。
myArray.filter(x => x.id === '45').map(x => x.foo);
サイドノート:のようなメソッドfind()
またはfilter()
、そして矢印の機能は、ので、あなたはこれらのブラウザをサポートしたい場合は、あなたが使用してコードtranspileなければならない、(IEのような)古いブラウザでサポートされていないバベル(とポリフィルを)。
すでにjQueryを使用しているため、配列を検索するためのgrep関数を使用できます。
var result = $.grep(myArray, function(e){ return e.id == id; });
結果は、見つかった項目の配列です。オブジェクトが常に存在し、1回だけ発生することがわかっている場合は、を使用result[0].foo
して値を取得できます。それ以外の場合は、結果の配列の長さを確認する必要があります。例:
if (result.length === 0) {
// no result found
} else if (result.length === 1) {
// property found, access the foo property using result[0].foo
} else {
// multiple items found
}
===
には==
、の代わりに使用する方が安全==
です。
e.id
とid
文字列になり、私が使用することのOKを想定します==
。あなたがわからない場合は(以降しかし、あなたが問題に直面するかもしれない'' == 0
ですtrue
が、'' === 0
ありますfalse
)。言うまでもなく===
、高速であるようです(stackoverflow.com/questions/359494/…)。
===
機能するため、基本的には常に使用します。JavaScriptには存在しないと思います。==
==
別の解決策は、ルックアップオブジェクトを作成することです。
var lookup = {};
for (var i = 0, len = array.length; i < len; i++) {
lookup[array[i].id] = array[i];
}
... now you can use lookup[id]...
これは、多くの検索を行う必要がある場合に特に興味深いものです。
IDとオブジェクトが共有されるため、これはより多くのメモリを必要としません。
lookup
オブジェクトの作成は時間の無駄です。
ECMAScript 2015は、配列に対してfind()メソッドを提供します。
var myArray = [
{id:1, name:"bob"},
{id:2, name:"dan"},
{id:3, name:"barb"},
]
// grab the Array item which matchs the id "2"
var item = myArray.find(item => item.id === 2);
// print
console.log(item.name);
外部ライブラリなしで動作します。ただし、古いブラウザのサポートが必要な場合は、このポリフィルを含めることができます。
myArray.find(d=>d.id===45).foo;
。
myArray.find(d => d.id === 45)?.foo
。
Underscore.jsには、そのための優れたメソッドがあります。
myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'},etc.]
obj = _.find(myArray, function(obj) { return obj.id == '45' })
最も簡単な方法は次のようになると思いますが、Internet Explorer 8(またはそれ以前)では機能しません。
var result = myArray.filter(function(v) {
return v.id === '45'; // Filter out the appropriate one
})[0].foo; // Get result and access the foo property
for
か?
for
ループに比べて高速ではありません。
for
ループは常に最初の一致で終了するのに対し、私が見る限り、常に配列全体をスキャンします。
id
以下をお試しください
function findById(source, id) {
for (var i = 0; i < source.length; i++) {
if (source[i].id === id) {
return source[i];
}
}
throw "Couldn't find object with id: " + id;
}
myArray.filter(function(a){ return a.id == some_id_you_want })[0]
上記のfindById関数の一般的でより柔軟なバージョン:
// array = [{key:value},{key:value}]
function objectFindByKey(array, key, value) {
for (var i = 0; i < array.length; i++) {
if (array[i][key] === value) {
return array[i];
}
}
return null;
}
var array = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];
var result_obj = objectFindByKey(array, 'id', '45');
ここには多くの正しい答えがありますが、それらの多くは、これを2回以上行うと不必要にコストのかかる操作であるという事実に対処していません。極端な場合には、これが実際のパフォーマンスの問題の原因になる可能性があります。
現実の世界では、多くのアイテムを処理していてパフォーマンスが懸念される場合は、最初にルックアップを作成する方がはるかに高速です。
var items = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];
var lookup = items.reduce((o,i)=>o[i.id]=o,{});
その後、次のような一定の時間にアイテムを取得できます。
var bar = o[id];
ルックアップとして、オブジェクトの代わりにマップを使用することも検討してください:https : //developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map
Array.reduce
var array = [ {'id':'73' ,'foo':'bar'} , {'id':'45' ,'foo':'bar'} , ];
var id = 73;
var found = array.reduce(function(a, b){
return (a.id==id && a) || (b.id == id && b)
});
見つかった場合はオブジェクト要素を返し、見つからない場合は false
これを複数回行う場合は、マップ(ES6)を設定できます。
const map = new Map( myArray.map(el => [el.id, el]) );
次に、単に行うことができます:
map.get(27).foo
これは、純粋なJavaScriptでそれを実行する方法です。ECMAScript3以降で機能することを考えることができる最小限の方法で。一致が見つかるとすぐに戻ります。
var getKeyValueById = function(array, key, id) {
var testArray = array.slice(), test;
while(test = testArray.pop()) {
if (test.id === id) {
return test[key];
}
}
// return undefined if no matching id is found in array
return;
}
var myArray = [{'id':'73', 'foo':'bar'}, {'id':'45', 'foo':'bar'}]
var result = getKeyValueById(myArray, 'foo', '45');
// result is 'bar', obtained from object with id of '45'
http://sugarjs.com/からSugarjsを試すことができます。
Arraysには非常に優れたメソッドがあり.find
ます。したがって、次のような要素を見つけることができます。
array.find( {id: 75} );
さらに多くのプロパティを持つオブジェクトをそれに渡して、別の「where-clause」を追加することもできます。
Sugarjsはネイティブオブジェクトを拡張し、一部の人々はこれを非常に悪いと考えています...
find
か、これが正確に何が起こったのかを推測します。私の提案は、ネイティブプロトタイプを拡張する場合は、常により具体的な名前を使用し、最も単純なものは将来の標準開発に任せることです。
最近、巨大な配列から文字列を検索する必要があるのと同じ問題に直面する必要があります。
いくつか検索したところ、簡単なコードで簡単に処理できることがわかりました。
コード:
var items = mydata.filter(function(item){
return item.word.toLowerCase().startsWith( 'gk );
})
配列内の任意のアイテムを反復します。アクセスするすべてのアイテムについて、そのアイテムのIDを確認します。一致する場合は、それを返します。
codezが必要な場合:
function getId(array, id) {
for (var i = 0, len = array.length; i < len; i++) {
if (array[i].id === id) {
return array[i];
}
}
return null; // Nothing found
}
そして、ECMAScript 5の配列メソッドを使用して同じこと:
function getId(array, id) {
var obj = array.filter(function (val) {
return val.id === id;
});
// Filter returns an array, and we just want the matching item.
return obj[0];
}
配列に対して組み込みの「フィルター」関数を使用することにより、純粋なJavaScriptでもこれを行うことができます。
Array.prototype.filterObjects = function(key, value) {
return this.filter(function(x) { return x[key] === value; })
}
したがって、単にの代わりに「id」を渡し、の代わりにkey
「45」を渡すvalue
と、45のidに一致する完全なオブジェクトが取得されます。つまり、
myArr.filterObjects("id", "45");
Array.prototype.filter()
関数を使用します。
デモ:https : //jsfiddle.net/sumitridhal/r0cz0w5o/4/
JSON
var jsonObj =[
{
"name": "Me",
"info": {
"age": "15",
"favColor": "Green",
"pets": true
}
},
{
"name": "Alex",
"info": {
"age": "16",
"favColor": "orange",
"pets": false
}
},
{
"name": "Kyle",
"info": {
"age": "15",
"favColor": "Blue",
"pets": false
}
}
];
フィルタ
var getPerson = function(name){
return jsonObj.filter(function(obj) {
return obj.name === name;
});
}
.filter
メソッドを使用しobj.info
ます。 var getPerson = function(name){ return jsonObj.filter(function(obj) { return obj.info.filter(function(info) { return pets === false; }); }); }
Jqueryメソッドを使用できます $.each()/$.grep()
var data= [];
$.each(array,function(i){if(n !== 5 && i > 4){data.push(item)}}
または
var data = $.grep(array, function( n, i ) {
return ( n !== 5 && i > 4 );
});
ES6構文を使用します。
Array.find, Array.filter, Array.forEach, Array.map
または使用Lodash https://lodash.com/docs/4.17.10#filter、アンダースコアhttps://underscorejs.org/#filter
Aaron Digullaが提供する答えは本当に気に入りましたが、後で繰り返し処理できるようにオブジェクトの配列を保持する必要がありました。だから私はそれを
var indexer = {};
for (var i = 0; i < array.length; i++) {
indexer[array[i].id] = parseInt(i);
}
//Then you can access object properties in your array using
array[indexer[id]].property
使用する:
var retObj ={};
$.each(ArrayOfObjects, function (index, obj) {
if (obj.id === '5') { // id.toString() if it is int
retObj = obj;
return false;
}
});
return retObj;
IDでオブジェクトを返す必要があります。
このソリューションも役立ちます。
Array.prototype.grep = function (key, value) {
var that = this, ret = [];
this.forEach(function (elem, index) {
if (elem[key] === value) {
ret.push(that[index]);
}
});
return ret.length < 2 ? ret[0] : ret;
};
var bar = myArray.grep("id","45");
私はそれを同じように$.grep
して、1つのオブジェクトが見つかると、関数は配列ではなくオブジェクトを返します。
function will return the object, rather than an array
間違いをするかもしれませんが、それはユーザー次第だと思います。
aggatonの答えから始めて、これはnull
、array
とcallback
「正しい」要素の真の値を返す関数が与えられた場合、実際に必要な要素を(または見つからない場合)返す関数です。
function findElement(array, callback) {
var elem;
return array.some(function(e) {
if (callback(e)) {
elem = e;
return true;
}
}) ? elem : null;
});
これはIE8ではサポートされていないため、ネイティブでは機能しないことに注意してくださいsome
。ポリフィルを提供することもできますが、代わりに常にクラシックfor
ループがあります。
function findElement(array, callback) {
for (var i = 0; i < array.length; i++)
if (callback(array[i])) return array[i];
return null;
});
実際には、より高速でコンパクトです。しかし、ホイールを作り直したくない場合は、アンダースコアやロダッシュなどのユーティリティライブラリを使用することをお勧めします。
最短、
var theAnswerObj = _.findWhere(array, {id : 42});