1. ホーム
  2. javascript

[解決済み] javascript のフィルター配列の複数条件

2022-09-11 22:02:16

質問

オブジェクトの配列を簡略化したい。以下のような配列があるとします。

var users = [{
    name: 'John',
    email: '[email protected]',
    age: 25,
    address: 'USA'
    },
    {
        name: 'Tom',
        email: '[email protected]',
        age: 35,
        address: 'England'
    },
    {
        name: 'Mark',
        email: '[email protected]',
        age: 28,
        address: 'England'
}];

そして、フィルタオブジェクト。

var filter = {address: 'England', name: 'Mark'};

例えば、私はすべてのユーザーを住所と名前でフィルタリングする必要があるので、フィルタリングオブジェクトのプロパティを通してループし、それをチェックアウトしています。

function filterUsers (users, filter) {
    var result = [];
    for (var prop in filter) {
        if (filter.hasOwnProperty(prop)) {

            //at the first iteration prop will be address
            for (var i = 0; i < filter.length; i++) {
                if (users[i][prop] === filter[prop]) {
                    result.push(users[i]);
                }
            }
        }
    }
    return result;
}

ですから、最初の反復処理で prop - address が等しくなるように 'England' の場合、配列の結果には二人のユーザが追加されます(名前は Tom と Mark)。 prop name は等しくなります。 Mark のみが配列の結果に追加されるはずですが、私は配列に2つの要素を持つことになります。

なぜこのようなことが起こるのか、少しはわかってきたのですが、まだ行き詰っていて、修正するための良い解決策を見つけることができません。どんな助けでも感謝します。ありがとうございます。

どのように解決するのですか?

次のような方法があります。

var filter = {
  address: 'England',
  name: 'Mark'
};
var users = [{
    name: 'John',
    email: '[email protected]',
    age: 25,
    address: 'USA'
  },
  {
    name: 'Tom',
    email: '[email protected]',
    age: 35,
    address: 'England'
  },
  {
    name: 'Mark',
    email: '[email protected]',
    age: 28,
    address: 'England'
  }
];


users= users.filter(function(item) {
  for (var key in filter) {
    if (item[key] === undefined || item[key] != filter[key])
      return false;
  }
  return true;
});

console.log(users)