2012-10-28 35 views
6

Giả sử tôi có hai mảng: một là regex và một là đầu vào. Điều gì, sau đó, là cách tốt nhất - về hiệu suất và khả năng đọc - để làm một cái gì đó giống như đầu ra?làm thế nào chúng ta có thể lọc các phần tử trong mảng với regex trong mảng với javascript?

var regex = [ 
    '/rat/', 
    '/cat/' 
    '/dog/', 
    '/[1-9]/' 
] 

var texts = [ 
    'the dog is hiding', 
    'cat', 
    'human', 
    '1' 
] 

kết quả cuối cùng là

result = [ 
    'human' 
] 

Vâng, những gì tôi đã suy nghĩ là phải làm một cái gì đó giống như reduce:

// loop by text 
for (var i = texts.length - 1; i >= 0; i--) { 
    // loop by regex 
    texts[i] = regex.reduce(function (previousValue, currentValue) { 
     var filterbyRegex = new RegExp("\\b" + currentValue + "\\b", "g"); 
     if (previousValue.toLowerCase().match(filterbyRegex)) { 
      delete texts[i]; 
     }; 
     return previousValue; 
    }, texts[i]); 
} 

Nhưng, đó là không thể đọc được? Có lẽ có một cách khác mà tôi đã không nghĩ đến.

+1

Xem thông tin này tại http://stackoverflow.com/questions/13107048/javascript-desconstrutioning-menu –

+1

@IamAndy câu hỏi đó có liên quan như thế nào đến từ xa này? – Alnitak

Trả lời

7

tôi có lẽ sẽ đi một cái gì đó như thế này

var regexs = [ 
    /rat/i, 
    /cat/i, 
    /dog/i, 
    /[1-9]/i 
] 

var texts = [ 
    'the dog is hiding', 
    'cat', 
    'human', 
    '1' 
] 

var goodStuff = texts.filter(function (text) { 
    return !regexs.some(function (regex) { 
     return regex.test(text); 
    }); 
}); 

Nhưng thực tế, sự khác biệt hiệu suất rất đáng kể ở đây trừ khi bạn làm 10.000 lần.

Xin lưu ý rằng đây sử dụng phương pháp ES5, đó là một cách dễ dàng shimmable (I tạo thành một từ tôi biết)

+0

sử dụng tốt '.some' - tôi đã quên điều đó. – Alnitak

+0

Cảm ơn bro, tôi đã nhận thấy rằng hầu hết các chức năng mảng có thể được tìm thấy với các phương pháp ít phổ biến hiện có, hoặc sử dụng chúng sâu hơn. Họ rất mạnh mẽ. đạo cụ để ECMA bé trai –

+0

là công bằng, hầu hết các phương pháp đã được chèn ép từ ngôn ngữ lập trình chức năng mà các chức năng thao tác danh sách là cốt lõi cho ngôn ngữ. – Alnitak

1

Bạn rõ ràng phải xử lý mảng văn bản elemnt theo yếu tố. Tuy nhiên, bạn có thể kết hợp regexps của bạn thành một đơn lẻ bằng cách tham gia với '|'

Mảng regexps bạn hiển thị thực sự là chuỗi đơn giản. Tôi sẽ loại bỏ các hàng đầu và dấu/ký tự và sau đó xây dựng một regexp duy nhất. Một cái gì đó như:

function reduce (texts, re) { 
    re = new RegExp (re.join ('|')); 
    for (var r = [], t = texts.length; t--;) 
    !re.test (texts[t]) && r.unshift (texts[t]); 
    return r; 
} 

alert (reduce (['the dog is hiding', 'cat', 'human', '1'], ['rat', 'cat', 'dog', '[1-9]'])) 

Hãy nhận biết rằng nếu chuỗi lại của bạn có chứa RegExp ký tự đặc biệt thích {[^ $ vv bạn sẽ cần phải thoát khỏi họ hoặc trong các dây hoặc xử lý chúng trong hàm..

Xem jsfiddle: http://jsfiddle.net/jstoolsmith/D3uzW/

+0

câu trả lời này cũng không được phân biệt chữ hoa chữ thường hoặc tìm kiếm các ranh giới từ – Alnitak

2

Đây là giải pháp của tôi:

var words = [ 'rat', 'cat', 'dog', '[1-9]' ]; 

var texts = [ ... ]; 

// normalise (and compile) the regexps just once 
var regex = words.map(function(w) { 
    return new RegExp('\\b' + w + '\\b', 'i'); 
}); 

// nested .filter calls, removes any word that is 
// found in the regex list 
texts = texts.filter(function(t) { 
    return regex.filter(function(re) { 
     return re.test(t); 
    }).length === 0; 
}); 

http://jsfiddle.net/SPAKK/

0

Chỉ cần một ý tưởng, kết hợp các mảng regex để một regex mới và kết hợp các mảng thứ hai thành một chuỗi mới , mỗi giá trị được chia với một tín hiệu, chẳng hạn như @, #, sau đó sử dụng regex để thay thế phần khớp.

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