2016-02-24 34 views
5

Tôi đang học lodash. Có thể sử dụng lodash để tìm chuỗi con trong một chuỗi các chuỗi không?sử dụng lodash để tìm chuỗi con từ mảng chuỗi

var myArray = [ 
    'I like oranges and apples', 
    'I hate banana and grapes', 
    'I find mango ok', 
    'another array item about fruit' 
    ] 

có thể xác nhận nếu từ 'cam' nằm trong mảng của tôi không? _.includes Tôi đã thử, _.some, _.indexOf nhưng tất cả đều thất bại khi họ nhìn vào chuỗi đầy đủ, không phải là một chuỗi

+0

Bạn có thể tham gia mảng thành chuỗi và sử dụng indexOf không? – James

Trả lời

12

Bạn có thể dễ dàng tạo một iteratee cho some() bằng các hàm bậc cao của lodash. Ví dụ:

_.some(myArray, _.unary(_.partialRight(_.includes, 'orange'))); 

Chức năng unary() đảm bảo rằng chỉ một đối số được chuyển đến hàm gọi lại. Hàm partialRight() được sử dụng để áp dụng giá trị 'orange' làm đối số thứ hai cho includes(). Đối số đầu tiên được cung cấp với mỗi lần lặp của some().

Tuy nhiên, cách tiếp cận này sẽ không hoạt động nếu có vấn đề về độ nhạy. Ví dụ: 'Orange' sẽ trả về false. Dưới đây là cách bạn có thể xử lý độ nhạy trường hợp:

_.some(myArray, _.method('match', /Orange/i)); 

Hàm method() tạo ra một hàm sẽ gọi phương thức đã cho của đối số đầu tiên được chuyển cho đối số. Ở đây, chúng tôi đang đối sánh với một biểu thức chính quy không phân biệt chữ hoa chữ thường.

Hoặc, nếu trường hợp nhạy cảm không quan trọng và bạn chỉ đơn giản là thích cách tiếp cận method(), công trình này cũng cho ES2015:

_.some(myArray, _.method('includes', 'orange')); 
+1

Giải thích tuyệt vời về một số chức năng, cảm ơn bạn. Tôi thích những ví dụ này về việc thực hiện hữu ích của Alexander Yatkevich của _.curry, vì _.method không yêu cầu tạo ra một hàm tùy chỉnh riêng biệt. –

+0

Tôi đã nhận thấy một truy vấn nhỏ với ví dụ không phân biệt chữ hoa chữ thường. Nếu từ 'Orange' là một biến (có thể là bất kỳ từ nào), chúng ta sẽ phải thoát khỏi nó trước khi vượt qua nó? tức là một cái gì đó như thế này (không được kiểm tra) 'var myWord = 'Orange'; _.một số (myArray, _.method ('match', new RegExp (_. escapeRegExp (myWord), "i"))); ' –

3

Hai cách nhanh chóng để làm điều đó - không sử dụng lodash (xin lỗi)

var found = myArray.filter(function(el){ 
    return el.indexOf('oranges') > -1; 
}).length; 

if (found) { // oranges was found } 

hoặc như tôi đã đề cập trong các bình luận:

var found = myArray.join(',').indexOf('oranges') > -1; 
if (found) { // oranges was found } 
+0

Cảm ơn James. Những công trình này tuyệt vời. Nếu không ai làm rõ một cách lodash tôi sẽ đánh dấu câu trả lời của bạn là chính xác. –

+0

Phương pháp cuối cùng là rất tốt cho hầu hết các trường hợp, và nó hoạt động ngay cả trong các trình duyệt cũ. Không cần 'filter' hoặc' some'. – AsGoodAsItGets

0

Bạn có thể làm điều này bằng lodash, nhưng nó cũng rất doable sử dụng phương pháp javascript mẹ đẻ:

function stringArrayContains(array, str) { 
    function contains(el) { 
    return (el.indexOf(str) !== -1) ? true : false; 
    } 

    return array.some(contains); 
} 

Testing the above function:

var a = ['hello', 'there']; 
var b = ['see', 'ya', 'later']; 

stringArrayContains(a, 'ell') // true 
stringArrayContains(a, 'what') // false 
stringArrayContains(b, 'later') // true 
stringArrayContains(b, 'hello') // false 

Array.prototype.some applies một function you define to every element của an array. Hàm này (có tên chứa trong trường hợp của chúng tôi) phải trả về giá trị đúng hoặc sai. Trong khi lặp qua các phần tử mảng, nếu bất kỳ phần tử nào trả về đúng, phương thức trả về true.

Cá nhân, tôi nghĩ chung rằng nếu bạn có thể sử dụng các phương thức JS nguyên gốc cho các hàm đơn giản, bạn nên tải một thư viện để thực hiện điều tương tự. Lodash hoàn toàn không có lợi ích hiệu suất, nhưng chúng không nhất thiết phải được thực hiện trừ khi bạn đang xử lý một lượng lớn dữ liệu. Chỉ cần hai xu của tôi.

Chúc mừng!

0

Cách tốt nhất là xác định hàm để kiểm tra việc bao gồm chuỗi con.

var contains = _.curry(function (substring, source) { 
    return source.indexOf(substring) !== -1; 
}); 

Tôi sử dụng _.curry tại đây để có chức năng được thu thập, có thể áp dụng một phần rồi.

_.some(myArray, contains('item')); 

Bạn cũng có thể tìm thấy chuỗi con trong chuỗi đã tham gia.

contains('item', _.join(myArray)) 

UPD:

tôi đã không nhận thấy rằng lodash đã có một hàm để tìm giá trị trong một bộ sưu tập.

Chức năng _.includes hoàn toàn giống với những gì tôi đã xác định ở trên. Tuy nhiên, như mọi thứ trong lodash, nó sử dụng thứ tự khác nhau cho các đối số. Trong ví dụ của tôi, tôi đặt một nguồn làm đối số mới nhất cho hàm curried làm cho hàm của tôi hữu ích đối với lập trình kiểu điểm khi lodash đợi nguồn là đối số đầu tiên của cùng một hàm.

Kiểm tra nói chuyện với Brian Lonsdorf về vấn đề https://www.youtube.com/watch?v=m3svKOdZijA

này cũng mất một cơ hội để nhìn vào ramda.Thư viện này cung cấp một cách tốt hơn để lập trình chức năng thực tế trong JavaScript.

+1

Cảm ơn bạn về kỹ thuật sử dụng _.curry, vì tôi đang cố gắng tìm hiểu 'cách tiếp cận lodash' –

-1
_.some(myArray, function(str){ 
    return _.includes(str, 'orange') 
}) 
-1
let str1 = 'la rivière et le lapin sont dans le près'; 
let str2 = 'product of cooking class'; 
let str3 = 'another sentence to /^[analyse]/i with weird!$" [email protected]'; 

_.some(_.map(['rabbit','champs'], w => str1.includes(w)), Boolean), // false 
_.some(_.map(['cook'],   w => str2.includes(w)), Boolean), // true 
_.some(_.map(['analyse'],   w => str3.includes(w)), Boolean), // true 
0

Tôi chạy vào này chủ đề Câu hỏi/trả lời trong khi cố gắng tìm ra cách để khớp một chuỗi con với mỗi Chuỗi trong một Mảng và XÓA bất kỳ mục mảng nào có chứa chuỗi con.

Trong khi các câu trả lời ở trên đặt tôi đi đúng hướng và trong khi điều này không trả lời cụ thể câu hỏi gốc, chủ đề này xuất hiện đầu tiên trong tìm kiếm của Google khi bạn đang cố gắng tìm hiểu cách thực hiện việc xóa một mảng ở trên vì vậy tôi đã tìm ra câu trả lời ở đây.

tôi đã kết thúc việc tìm kiếm một cách để sử dụng chức năng _.remove Lodash để loại bỏ phù hợp với chuỗi mảng như sau:

 // The String (SubString) we want to match against array (for dropping purposes) 
     var searchSubString = "whatever" 

     // Remove all array items that contain the text "whatever" 
     _.remove(my_array, function(searchSubString) { 
       return n.indexOf(searchSubString) !== -1; 
      }); 

Về cơ bản indexOf là phù hợp với vị trí của chuỗi con trong chuỗi, nếu chuỗi là không tìm thấy nó sẽ trả về -1, khi indexOf trả về một số khác -1 (số là vị trí SubString trong số ký tự trong chuỗi Array).

Lodash loại bỏ mục Array đó thông qua đột biến mảng và mảng mới sửa đổi có thể được truy cập bằng cùng tên.

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