2009-11-18 30 views
20

Tôi đang làm việc với một loạt các hoạt Javascript Objects như vậy:Sử dụng jQuery inArray với mảng JavaScript Objects

var IssuesArray = [{"ID" : "1", "Name" : "Issue1"}, 
        {"ID" : "2", "Name" : "Issue2"}, 
        {"ID" : "3", "Name" : "Issue3"}]; 

nỗ lực cuối cùng của tôi đang cố gắng để loại bỏ một đối tượng từ mảng khi tôi biết ID của vật. Tôi đang cố gắng sử dụng mã như sau:

$.grep(IssuesArray, function(n, i) { 
    return i != $.inArray("2", IssuesArray); 
}); 

Vì vậy, điều này cho thấy tôi đang cố gắng sử dụng jQuery grep để xóa phần tử theo chỉ mục (i) mà tôi đang cố truy xuất bằng cách sử dụng jQuery inArray. Tất nhiên mã ở trên sẽ không hoạt động vì "2" phải tương ứng với một mục trong mảng, tất cả đều là các đối tượng JavaScript (một đối tượng sẽ không bao giờ bằng "2"). Tôi cần một cái gì đó như:

$.inArray(javascriptObject.Name=="2", IssuesArray); 

Có ai từng sử dụng inArray để lấy chỉ mục đối tượng JavaScript, sử dụng giá trị trường trong đối tượng đó không? Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn.

CẬP NHẬT/CLARIFICATION: Một vài người đã bị nhầm lẫn bởi câu hỏi của tôi, nhưng tôi đã nhận được câu trả lời hoạt động tốt. Tôi đang sử dụng:

IssuesArray = $.grep(IssuesArray, function(n) { 
    return n.ID != "2"; 
}); 

Tôi nghĩ rằng tôi đã nghĩ về nó quá sâu, khi giải pháp thực sự khá dễ dàng. Tôi chỉ muốn loại bỏ một đối tượng JavaScript khỏi một mảng, miễn là tôi biết giá trị của một thuộc tính cụ thể trong đối tượng đó. Giải pháp trên sử dụng grep của jQuery để trả về mọi thứ từ mảng ngoại trừ bất kỳ đối tượng nào có ID == "2". Như thường lệ, cảm ơn câu trả lời nhanh. Một vài câu trả lời là giải pháp tốt và có thể đã làm việc bằng cách sử dụng (sử dụng "splice", ví dụ), nhưng giải pháp này có vẻ là ngắn nhất đơn giản nhất. Cảm ơn một lần nữa.

+0

Tôi không biết bạn đang cố gắng làm gì ... – Greg

+0

không biết phương thức .grep nào cả (btw, tại sao nó được gọi là grep?) - tuyệt vời, đối với mảng nhỏ hơn; nó sao chép mảng, mặc dù vậy, để tập dữ liệu lớn hơn, nó có thể tốt hơn để loại bỏ các phần tử khỏi mảng ban đầu, nhưng điều đó phụ thuộc rất nhiều vào những gì bạn đang cố gắng lưu trữ :) – Patonza

Trả lời

33

n là mục danh sách của bạn, vì vậy một cái gì đó như thế này nên thực hiện công việc:

$.grep(issuesArray, function(n) { return n.ID != "2"; }) 
+0

Điều này dường như làm những gì tôi cần làm. Cảm ơn! –

+1

Có thể sử dụng so sánh nghiêm ngặt! == thay vì! = –

6

Không chắc chắn nếu tôi hiểu câu hỏi của bạn một cách chính xác, nhưng tôi sẽ làm gì:

$.each(IssuesArray, function(i, item){ 
    if (item.ID == IDToBeRemoved) IssuesArray.splice(i, 1); 
}); 
+0

+1 giải pháp rất thanh lịch. –

0

Nếu không sử dụng jQuery hoặc các khung công tác khác:

var newArray = []; 
var i=0, len=IssuesArray.length; 
var bad_id = "2"; // or whatever 
while(i<len) { 
    if(IssuesArray[i].ID !== bad_id) { 
    newArray.push(IssuesArray[i++]); 
    } 
} 
0

Đơn giản hóa ??

var IssuesArray = { 
    1: "Issue1", 
    2: "Issue2", 
    3: "Issue3" 
}; 
var issue2 = IssuesArray[2]; 

Tại sao danh sách các băm khi một băm đơn sẽ làm gì?

+0

Không muốn đi sâu vào chi tiết trong câu hỏi của tôi, nhưng tôi có nhiều dữ liệu hơn trong "Sự cố" chứ không chỉ tên và ID. Có tổng cộng 5 trường, do đó, một băm sẽ không đủ. Cảm ơn cho ý tưởng mặc dù. –

2
var spliceID = function(id, arr) { 
    $(arr).each(function(i, el) { 
     if (el.ID == id) { 
      arr.splice(i,1); 
      return false; 
     } 
    }); 
    return arr; 
} 

console.log(spliceID('2', IssuesArray)); 
Các vấn đề liên quan