2015-08-05 14 views
14

Tôi muốn đơn giản hóa một mảng đối tượng. Giả sử rằng tôi có mảng sau:mảng lọc javascript nhiều điều kiện

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' 
}]; 

Và bộ lọc đối tượng:

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

Ví dụ tôi cần phải lọc tất cả người dùng theo địa chỉ và tên, vì vậy tôi làm vòng lặp thông qua thuộc tính đối tượng bộ lọc và kiểm tra xem nó ra:

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

Vì vậy, trong quá trình lặp đầu tiên khi prop - address sẽ bằng 'England' hai người dùng sẽ được bổ sung vào kết quả mảng (với tên Tom và Mark), nhưng trên lần lặp thứ hai khi prop name sẽ bằng Mark chỉ người dùng cuối cùng mới được thêm vào kết quả mảng, nhưng tôi kết thúc với hai phần tử trong mảng.

Tôi đã có một ý tưởng nhỏ là tại sao nó xảy ra nhưng vẫn bị mắc kẹt trên đó và không thể tìm thấy một giải pháp tốt để sửa chữa nó. Bất kỳ trợ giúp nào đều đáng được đánh giá cao. Cảm ơn.

+0

tại sao bạn lặp qua sử dụng 2 lần? – webduvet

Trả lời

32

bạn có thể làm như thế này

var filter = {address: 'England', name: 'Mark'}; 
users = users.filter(function(item) { 
    for(var key in filter) { 
     if(item[key] === undefined || item[key] != filter[key]) 
      return false; 
    } 
    return true; 
}); 
+0

cảm ơn cho câu trả lời, nó đã giúp – user3673623

+2

Happy để giúp :) tôi quá học hỏi rất nhiều từ stackoverflow – Raghavendra

+0

điều này là tốt nhất nhưng thực sự im nhận Uncaught ReferenceError: bộ lọc không được xác định –

0

Nếu dứt khoát của bạn đang kết nối người dùng lọc, tôi sẽ đảo ngược for để đánh giá user thay vì giảm mảng kết quả trong mỗi lần lặp.

đây một (chưa được kiểm tra) ví dụ:

function filterUsers (users, filter) { 
    var result = []; 

    for (i=0;i<users.length;i++){ 
     for (var prop in filter) { 
      if (users.hasOwnProperty(prop) && users[i][prop] === filter[prop]) { 
       result.push(users[i]); 
      } 
     } 
    } 
    return result; 
} 
1

Tôi nghĩ rằng điều này có thể giúp đỡ.

const filters = ['a', 'b']; 
 

 
const results = [ 
 
    { 
 
    name: 'Result 1', 
 
    category: ['a'] 
 
    }, 
 
    { 
 
    name: 'Result 2', 
 
    category: ['a', 'b'] 
 
    }, 
 
    { 
 
    name: 'Result 3', 
 
    category: ['c', 'a', 'b', 'd'] 
 
    } 
 
]; 
 

 
const filteredResults = results.filter(item => 
 
    filters 
 
    .map(val => item.category.indexOf(val)) 
 
    .map(val => (val > -1 ? true : false)) 
 
    .reduce((acc, cum) => acc && cum) 
 
); 
 

 
console.log(filteredResults); 
 

4

Another take for those of you that enjoy succinct code.

LƯU Ý: Các LỌC phương pháp có thể mất thêm một cuộc tranh cãi này, sau đó sử dụng một mũi tên chức năng E6 chúng ta có thể tái sử dụng đúng này để có được một lớp lót đẹp.

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 query = {address: "England", name: "Mark"}; 
 

 
var result = users.filter(search, query); 
 

 
function search(user){ 
 
    return Object.keys(this).every((key) => user[key] === this[key]); 
 
} 
 

 

 

 

 
// |----------------------- Code for displaying results -----------------| 
 
var element = document.getElementById('result'); 
 

 
function createMarkUp(data){ 
 
    Object.keys(query).forEach(function(key){ 
 
    var p = document.createElement('p'); 
 
    p.appendChild(document.createTextNode(
 
    key.toUpperCase() + ': ' + result[0][key])); 
 
    element.appendChild(p); 
 
    }); 
 
} 
 

 
createMarkUp(result);
<div id="result"></div>

0

Bạn có thể làm điều này trong một dòng

users = users.filter(obj => obj.name == filter.name && obj.address == filter.address) 
Các vấn đề liên quan