2012-08-06 13 views
7

Hiện nay tôi trở lại một phản ứng JSON như thế này ...Đang tìm kiếm các mục trong một mảng JSON Sử dụng Node (tốt nhất là không lặp lại)

{items:[ 
    {itemId:1,isRight:0}, 
    {itemId:2,isRight:1}, 
    {itemId:3,isRight:0} 
]} 

Tôi muốn thực hiện một cái gì đó như thế này (pseudo code)

var arrayFound = obj.items.Find({isRight:1}) 

này sau đó sẽ trở lại

[{itemId:2,isRight:1}] 

tôi biết tôi có thể làm điều này với một cho mỗi vòng lặp, tuy nhiên, tôi đang cố gắng để tránh điều này. Đây hiện là phía máy chủ trên ứng dụng Node.JS.

+0

Trừ khi bạn có biết thêm, lặp đi lặp lại là không thể tránh khỏi. Nhưng tại sao bạn đang cố gắng loại trừ điều đó? – Zirak

+0

Bạn có ý nghĩa gì bởi "* không lặp lại *"? Làm thế nào mà có thể làm việc? – Bergi

+0

Tôi cho rằng tôi có nghĩa là không có mẫu sửa đổi truyền thống (thường xuyên cho mỗi vòng lặp) Nhưng tôi chắc chắn đó là một số sử dụng sáng tạo của regex và/hoặc ánh xạ có thể được sử dụng. – Jackie

Trả lời

19
var arrayFound = obj.items.filter(function(item) { 
    return item.isRight == 1; 
}); 

Tất nhiên bạn cũng có thể viết một hàm để tìm các mục bởi một đối tượng văn chương như một điều kiện:

Array.prototype.myFind = function(obj) { 
    return this.filter(function(item) { 
     for (var prop in obj) 
      if (!(prop in item) || obj[prop] !== item[prop]) 
       return false; 
     return true; 
    }); 
}; 
// then use: 
var arrayFound = obj.items.myFind({isRight:1}); 

Cả hai chức năng tận dụng các native .filter() method trên Mảng.

+0

Điều thú vị là nó vẫn sử dụng lặp lại. Tôi không có ý định của OP. – Zirak

3

Vì Nút thực hiện đặc tả EcmaScript 5, bạn có thể sử dụng Array#filter trên obj.items.

2

đã chỉnh sửa để sử dụng phương pháp bản địa

var arrayFound = obj.items.filter(function() { 
    return this.isRight == 1; 
}); 
+2

Rất có thể anh ta sử dụng jQuery trong Node.js và thậm chí nếu nó có sẵn thì nên sử dụng phương pháp lọc gốc. – Bergi

+1

Vâng, bạn nói đúng. Phương pháp lọc tự nhiên đã làm tôi suy nghĩ – mathisonian

1

Trên thực tế tôi thấy một cách dễ dàng hơn nếu bạn đang sử dụng MongoDB để tồn tại bạn tài liệu ...

findDocumentsByJSON = function(json, db,docType,callback) { 
    this.getCollection(db,docType,function(error, collection) { 
    if(error) callback(error) 
    else { 
     collection.find(json).toArray(function(error, results) { 
     if(error) callback(error) 
     else 
      callback(null, results) 
     }); 
    } 
    }); 
} 

Sau đó bạn có thể vượt qua {isRight: 1 } cho phương thức và trả về một mảng CHỈ của các đối tượng, cho phép tôi đẩy việc nâng vật nặng lên cho mongo có khả năng.

0

Bạn có thể thử tìm ra kết quả dự kiến ​​được sử dụng find function, bạn có thể xem kết quả trong kịch bản sau đây:

var jsonItems = {items:[ 
 
    {itemId:1,isRight:0}, 
 
    {itemId:2,isRight:1}, 
 
    {itemId:3,isRight:0} 
 
]} 
 

 
var rta = jsonItems.items.find(
 
    (it) => { 
 
    return it.isRight === 1; 
 
    } 
 
); 
 

 
    
 
console.log("RTA: " + JSON.stringify(rta)); 
 

 
// RTA: {"itemId":2,"isRight":1}

Các vấn đề liên quan