Làm thế nào tôi có thể có được chỉ mục của đối tượng tha phù hợp với một điều kiện (không lặp đi lặp lại dọc theo mảng)?
Bạn không thể, một cái gì đó phải lặp qua mảng (ít nhất một lần).
Nếu điều kiện thay đổi nhiều, thì bạn sẽ phải lặp lại và nhìn vào các đối tượng trong đó để xem chúng có khớp với điều kiện không. Tuy nhiên, trên một hệ thống có các tính năng ES5 (hoặc nếu bạn cài đặt shim), việc lặp lại đó có thể được thực hiện khá chính xác:
var index;
yourArray.some(function(entry, i) {
if (entry.prop2 == "yutu") {
index = i;
return true;
}
});
Đó là sử dụng mới (ish) Array#some
chức năng , trong đó vòng qua các mục trong mảng cho đến khi chức năng bạn cho nó trả về true. Hàm tôi đã cung cấp cho nó lưu chỉ mục của mục phù hợp, sau đó quay lại true
để dừng lặp.
Hoặc tất nhiên, chỉ cần sử dụng một for
vòng lặp. Các tùy chọn lặp khác nhau của bạn được đề cập trong câu trả lời khác này .
Nhưng nếu bạn luôn sử dụng cùng một thuộc tính cho tra cứu này và nếu các giá trị thuộc tính là duy nhất, bạn có thể lặp lại chỉ một lần và tạo một đối tượng để ánh xạ chúng:
var prop2map = {};
yourArray.forEach(function(entry) {
prop2map[entry.prop2] = entry;
});
(Hoặc, một lần nữa, bạn có thể sử dụng một for
vòng lặp hoặc bất kỳ tùy chọn nào khác của bạn .)
Sau đó, nếu bạn cần tìm mục với prop2 = "yutu"
, bạn có thể làm điều này:
var entry = prop2map["yutu"];
Tôi gọi đây là "lập chỉ mục chéo" mảng. Đương nhiên, nếu bạn xóa hoặc thêm các mục (hoặc thay đổi prop2
giá trị của chúng ), bạn cũng cần cập nhật đối tượng ánh xạ của mình.
0
?). Cả hai giải pháp đều lặp đi lặp lại nhiều hơn yêu cầu, ít hơn lý tưởng nếu mảng lớn (mặc dù tỷ lệ của nó quá lớn, con người sẽ nhận thấy là thấp, trừ khi việc tra cứu đang diễn ra rất nhiều ).