javascript フィルター配列 複数の条件 質問する

javascript フィルター配列 複数の条件 質問する

オブジェクトの配列を単純化したいと思います。次のような配列があると仮定します。

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'、2 人のユーザー (名前は Tom と Mark) が配列結果に追加されますが、2 番目の反復では、prop nameが等しい場合Mark、最後のユーザーのみが配列結果に追加されるはずですが、配列には 2 つの要素が含まれることになります。

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

ベストアンサー1

このようにすることができます

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)

おすすめ記事