オブジェクトの配列を単純化したいと思います。次のような配列があると仮定します。
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)