web-dev-qa-db-ja.com

オブジェクトキー値が配列にあるときに配列をフィルタリングする方法

私は次のような配列モデルを持っています:

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"
}
]

forEachangularループを使用してこれを行うことができますが、モデルオブジェクトに100を超えるレコードがあるためです。これをもっと良い方法で処理する方法についての提案が必要です。

カスタムフィルターを作成することを考えていますが、それに対するあなたの見解は何ですか(もしそうなら、これを達成するためのサンプルコードを提供してください)。

あなたの助けに感謝します。

ありがとう。

16
krsnaadi

あなたは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 );
10
Tim Elsass

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' } ] ]
2
isvforall

これは、一時オブジェクトを使用した高速なソリューションです。

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>');
2
Nina Scholz

最速の方法(余分なメモリが必要です):

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