2012-11-29 38 views
9

Làm cách nào để kiểm tra trong mảng đối tượng của tôi, nếu một mục cụ thể tồn tại (trong trường hợp của tôi là MachineId có id 2)?Kiểm tra xem giá trị có tồn tại trong đối tượng JavaScript

[{"MachineID":"1","SiteID":"20"},{"MachineID":"2","SiteID":"20"},{"MachineID":"3","SiteID":"20"},{"MachineID":"4","SiteID":"20"}] 

Tôi cố gắng này:

if (index instanceof machineIds.MachineID) { 
    alert('value is Array!'); 
} else { 
    alert('Not an array'); 
} 

Trả lời

11

Bằng cách trình duyệt chéo bạn có thể sử dụng phương pháp jQuery.grep() cho nó:

var item = $.grep(machineIds, function(item) { 
    return item.MachineID == index; 
}); 

if (item.length) { 
    alert("value is Array!"); 
} 
5

Cách đơn giản nhất để hiểu giải pháp là để lặp qua mảng, và kiểm tra mỗi một.

var match; 
for (var i = 0; i < yourArray.length; i++) { 
    if (yourArray[i].MachineId == 2) 
     match = yourArray[i]; 
} 

Lưu ý nếu có nhiều mục phù hợp, mục này sẽ trả về mục cuối cùng. Bạn cũng có thể ăn mặc này trong một chức năng.

function findByMachineId(ary, value) { 
    var match; 
    for (var i = 0; i < ary.length; i++) { 
     if (ary[i].MachineId == value) 
      match = ary[i]; 
    } 
    return match; 
} 
+0

Đối với quy định dữ liệu, bạn nên so sánh với '" 2 "' thay vì '2'. –

+0

Tôi sẽ không hoạt động nếu giá trị được tìm kiếm là số. – VisioN

+0

Hoặc chỉ xóa một trong những dấu hiệu '=' –

1

Bạn có thể sử dụng điều kiện này:

if (arr.filter(function(v){return this.MachineID == 2;}).length > 0) 
+0

Sẽ không hoạt động trên IE <= 8 [Sigh] –

+0

@SalmanA Nhưng có vẻ rất trơn tru: ( –

3

IMHO, bạn không cần thư viện của bên thứ ba như jQuery hoặc lặp lặp lại qua mảng. Có JavaScript Array some method làm những gì chúng tôi cần ở đây.

var yourArray = [{"MachineID":"1","SiteID":"20"},{"MachineID":"2","SiteID":"20"},{"MachineID":"3","SiteID":"20"},{"MachineID":"4","SiteID":"20"}]; 

var params = {searchedID: "2", elementFound: null}; 
var isCorrectMachineID = function(element) { 
    if (element.MachineID == this.searchedID); 
     return (this.elementFound = element); 
    return false; 
}; 

var isFound = yourArray.some(isCorrectMachineID, params) 

Mảng some phương pháp chấp nhận hai tham số:

  • gọi lại - Chức năng để kiểm tra cho mỗi yếu tố.
  • thisObject - Đối tượng sử dụng như thế này khi thực hiện gọi lại.

Chức năng gọi lại không được kết hợp với mã lặp và, sử dụng tham số nàyObject, bạn thậm chí có thể quay lại người gọi tìm thấy phần tử hoặc nhiều dữ liệu hơn. Nếu một phần tử như vậy được tìm thấy, somengay trả về true

http://jsfiddle.net/gu8Wq/1/

+0

Đã thử trong Chrome 46. Không thể xem trong mẫu thử nghiệm. Có phải chức năng này thực sự có sẵn với tất cả các trình duyệt? –

+0

Vui lòng xem tại đây: http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.17 và tại đây: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some # Browser_compatibility – freedev

1

Cũ câu hỏi vào thời điểm này, nhưng đây là một giải pháp ES6 sử dụng Array.find:

let machine2 = machines.find((machine) => machine.id === '2'); 
if (machine2) { 
    // ... 
} 
+0

Hãy nhớ rằng điều này KHÔNG hoạt động trong tất cả IE và một nửa số trình duyệt di động (tính đến tháng 11 năm 2016): [MDN Array.find compability browser] (https: //developer.mozilla .org/en-US/docs/Web/JavaScript/Tham khảo/Global_Objects/Array/find # Browser_compatibility) – Zanshin13

+1

Chắc chắn.Nếu bạn đang sử dụng ES6, bạn nên sử dụng Babel (hoặc một số trình biên dịch có thể so sánh được.) – ericsoco

0
var item = [{"MachineID":"1","SiteID":"20"},{"MachineID":"2","SiteID":"20"},{"MachineID":"3","SiteID":"20"},{"MachineID":"4","SiteID":"20"}]; 

var newItem = item.filter(function(i) { 
    return i.MachineID == 2; //it will return an object where MachineID matches with 2 
}); 

console.log(newItem); // will print [{"MachineID":"2","SiteID":"20"}] 
+1

vui lòng mô tả hoạt động của mã của bạn hoặc sử dụng các nhận xét tự giải thích! –

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