Tôi sử dụng ruleOut
chức năng của mình để lọc các đối tượng dựa trên các giá trị thuộc tính không mong muốn cụ thể. Tôi hiểu rằng trong ví dụ của bạn, bạn muốn sử dụng các điều kiện thay vì các giá trị, nhưng câu trả lời của tôi là hợp lệ cho tiêu đề câu hỏi, vì vậy tôi muốn để phương thức của mình ở đây.
function ruleOut(arr, filterObj, applyAllFilters=true) {
return arr.filter( row => {
for (var field in filterObj) {
var val = row[field];
if (val) {
if (applyAllFilters && filterObj[field].indexOf(val) > -1) return false;
else if (!applyAllFilters) {
return filterObj[field].filter(function(filterValue){
return (val.indexOf(filterValue)>-1);
}).length == 0;
}
}
}
return true;
});
}
Giả sử bạn có một danh sách các diễn viên như thế này:
let actors = [
{userName:"Mary", job:"star", language:"Turkish"},
{userName:"John", job:"actor", language:"Turkish"},
{userName:"Takis", job:"star", language:"Greek"},
{userName:"Joe", job:"star", language:"Turkish"},
{userName:"Bill", job:"star", language:"Turkish"}
];
và bạn muốn tìm tất cả các diễn viên được đánh giá là ngôi sao Holywood, quốc tịch của họ không nên là một trong những 'người Anh', 'người Ý', 'người Tây Ban Nha', 'người Hy Lạp', cộng với tên của họ sẽ không phải là một trong 'Mary', "Joe". Ví dụ Bizzar, tôi biết! Dù sao, với tập hợp các điều kiện đó, bạn sẽ tạo đối tượng sau:
let unwantedFieldsFilter= {
userName: ['Mary', 'Joe'],
job: ['actor'],
language: ['English', 'Italian', 'Spanish', 'Greek']
};
Được rồi, bây giờ nếu bạn ruleOut(actors, unwantedFieldsFilter)
chỉ nhận được
[{userName: "Bill", công việc: "sao", ngôn ngữ: "Thổ Nhĩ Kỳ"}]
Và Bill là người đàn ông của bạn, vì tên của anh ấy không phải là một trong 'Mary', 'Joe', quốc tịch của anh ấy không được bao gồm trong ['tiếng Anh', 'tiếng Ý', 'tiếng Tây Ban Nha', 'tiếng Hy Lạp'] cộng với anh ấy là một ngôi sao!
Có một tùy chọn trong phương thức của tôi, đó là applyAllFilters
và đúng theo mặc định. Nếu bạn cố gắng quy tắcOut với thông số này được đặt thành false, thì nó sẽ hoạt động như một bộ lọc 'HOẶC' thay vì 'VÀ'. Ví dụ: ruleOut(actors, {job:["actor"], language:["Italian"]}, false)
sẽ giúp bạn có được mọi người không phải là diễn viên hay người Ý:
[{userName: "Mary", công việc: "ngôi sao", ngôn ngữ: "Thổ Nhĩ Kỳ"},
{userName: "Takis", công việc: "ngôi sao", ngôn ngữ: "Hy Lạp"},
{userName: "Joe", công việc: "ngôi sao", ngôn ngữ: "Tiếng Thổ Nhĩ Kỳ"},
{userName: "Bill", công việc: "ngôi sao", ngôn ngữ: "Tiếng Thổ Nhĩ Kỳ"}]