オブジェクトキー値が配列にあるときに配列をフィルタリングする方法
私は次のような配列モデルを持っています:
records:[{
"empid":1,
"fname": "X",
"lname": "Y"
},
{
"empid":2,
"fname": "A",
"lname": "Y"
},
{
"empid":3,
"fname": "B",
"lname": "Y"
},
{
"empid":4,
"fname": "C",
"lname": "Y"
},
{
"empid":5,
"fname": "C",
"lname": "Y"
}
]
これで、empidの[1,4,5]
。
だから今、私は私の2番目のすべてのキーを含む最初の配列をフィルタリングする必要があります。
出力:
records:[{
"empid":1,
"fname": "X",
"lname": "Y"
},
{
"empid":4,
"fname": "C",
"lname": "Y"
},
{
"empid":5,
"fname": "C",
"lname": "Y"
}
]
forEach
でangular
ループを使用してこれを行うことができますが、モデルオブジェクトに100を超えるレコードがあるためです。これをもっと良い方法で処理する方法についての提案が必要です。
カスタムフィルターを作成することを考えていますが、それに対するあなたの見解は何ですか(もしそうなら、これを達成するためのサンプルコードを提供してください)。
あなたの助けに感謝します。
ありがとう。
あなたはArray.prototype.filter()
でそれを行うことができます、
var data = { records : [{ "empid": 1, "fname": "X", "lname": "Y" }, { "empid": 2, "fname": "A", "lname": "Y" }, { "empid": 3, "fname": "B", "lname": "Y" }, { "empid": 4, "fname": "C", "lname": "Y" }, { "empid": 5, "fname": "C", "lname": "Y" }] }
var empIds = [1,4,5]
var filteredArray = data.records.filter(function(itm){
return empIds.indexOf(itm.empid) > -1;
});
filteredArray = { records : filteredArray };
callBack
が_true
の値を返した場合、その特定のitm
に渡されたcallBack
は除外されます。詳細については、こちらをご覧ください こちら 。
ES6を使用した2019年:
const ids = [1, 4, 5],
data = {
records: [{
"empid": 1,
"fname": "X",
"lname": "Y"
}, {
"empid": 2,
"fname": "A",
"lname": "Y"
}, {
"empid": 3,
"fname": "B",
"lname": "Y"
}, {
"empid": 4,
"fname": "C",
"lname": "Y"
}, {
"empid": 5,
"fname": "C",
"lname": "Y"
}]
};
data.records = data.records.filter( i => ids.includes( i.empid ) );
console.info( data );
Array#filter
関数と追加の配列を使用して、並べ替えられた値を保存できます。
var recordsSorted = []
ids.forEach(function(e) {
recordsSorted.Push(records.filter(function(o) {
return o.empid === e;
}));
});
console.log(recordsSorted);
結果:
[ [ { empid: 1, fname: 'X', lname: 'Y' } ],
[ { empid: 4, fname: 'C', lname: 'Y' } ],
[ { empid: 5, fname: 'C', lname: 'Y' } ] ]
これは、一時オブジェクトを使用した高速なソリューションです。
var records = [{ "empid": 1, "fname": "X", "lname": "Y" }, { "empid": 2, "fname": "A", "lname": "Y" }, { "empid": 3, "fname": "B", "lname": "Y" }, { "empid": 4, "fname": "C", "lname": "Y" }, { "empid": 5, "fname": "C", "lname": "Y" }],
empid = [1, 4, 5],
object = {},
result;
records.forEach(function (a) {
object[a.empid] = a;
});
result = empid.map(function (a) {
return object[a];
});
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
最速の方法(余分なメモリが必要です):
var empid=[1,4,5]
var records = [{ "empid": 1, "fname": "X", "lname": "Y" }, { "empid": 2, "fname": "A", "lname": "Y" }, { "empid": 3, "fname": "B", "lname": "Y" }, { "empid": 4, "fname": "C", "lname": "Y" }, { "empid": 5, "fname": "C", "lname": "Y" }] ;
var empIdObj={};
empid.forEach(function(element) {
empIdObj[element]=true;
});
var filteredArray=[];
records.forEach(function(element) {
if(empIdObj[element.empid])
filteredArray.Push(element)
});