Hướng dẫn compare string with array javascript - so sánh chuỗi với javascript mảng

Cách thực tế

Tôi nghĩ thật sai lầm khi nói một triển khai cụ thể là "đúng cách ™" nếu nó chỉ "đúng" ("đúng") trái ngược với giải pháp "sai". Giải pháp của Tomáš là một cải tiến rõ ràng so với so sánh mảng dựa trên chuỗi, nhưng điều đó không có nghĩa là nó "đúng". Dù sao cũng đúng? Nó có phải là nhanh nhất? Nó có linh hoạt nhất không? Nó có phải là dễ hiểu nhất? Nó có phải là nhanh nhất để gỡ lỗi? Nó sử dụng các hoạt động ít nhất? Nó có bất kỳ tác dụng phụ? Không một giải pháp nào có thể có những điều tốt nhất trong tất cả mọi thứ.

Tomáš có thể nói rằng giải pháp của anh ấy rất nhanh nhưng tôi cũng sẽ nói rằng nó không cần thiết phải phức tạp. Nó cố gắng trở thành một giải pháp tất cả trong một hoạt động cho tất cả các mảng, được lồng hoặc không. Trên thực tế, nó thậm chí còn chấp nhận nhiều hơn là chỉ là một đầu vào và vẫn cố gắng đưa ra câu trả lời "hợp lệ".


Generics cung cấp khả năng tái sử dụng

Câu trả lời của tôi sẽ tiếp cận vấn đề khác nhau. Tôi sẽ bắt đầu với một thủ tục arrayCompare chung chỉ liên quan đến việc bước qua các mảng. Từ đó, chúng tôi sẽ xây dựng các chức năng so sánh cơ bản khác của chúng tôi như arrayEqual

// equal :: a -> a -> Bool
const equal = x => y =>
  x === y // notice: triple equal

// arrayEqual :: [a] -> [a] -> Bool
const arrayEqual =
  arrayCompare (equal)

const xs = [1,2,3]
const ys = [1,2,3]
console.log (arrayEqual (xs) (ys))      //=> true
// (1 === 1) && (2 === 2) && (3 === 3)  //=> true

const zs = ['1','2','3']
console.log (arrayEqual (xs) (zs))      //=> false
// (1 === '1')                          //=> false
0, v.v.

// arrayCompare :: (a -> a -> Bool) -> [a] -> [a] -> Bool
const arrayCompare = f => ([x,...xs]) => ([y,...ys]) =>
  x === undefined && y === undefined
    ? true
    : Boolean (f (x) (y)) && arrayCompare (f) (xs) (ys)

Theo tôi, loại mã tốt nhất thậm chí không cần bình luận, và điều này cũng không ngoại lệ. Có rất ít xảy ra ở đây đến nỗi bạn có thể hiểu hành vi của thủ tục này mà hầu như không có nỗ lực nào cả. Chắc chắn, một số cú pháp ES6 có vẻ xa lạ với bạn bây giờ, nhưng điều đó chỉ vì ES6 tương đối mới.

Như loại gợi ý, arrayCompare có hàm so sánh,

// equal :: a -> a -> Bool
const equal = x => y =>
  x === y // notice: triple equal

// arrayEqual :: [a] -> [a] -> Bool
const arrayEqual =
  arrayCompare (equal)

const xs = [1,2,3]
const ys = [1,2,3]
console.log (arrayEqual (xs) (ys))      //=> true
// (1 === 1) && (2 === 2) && (3 === 3)  //=> true

const zs = ['1','2','3']
console.log (arrayEqual (xs) (zs))      //=> false
// (1 === '1')                          //=> false
2 và hai mảng đầu vào,
// equal :: a -> a -> Bool
const equal = x => y =>
  x === y // notice: triple equal

// arrayEqual :: [a] -> [a] -> Bool
const arrayEqual =
  arrayCompare (equal)

const xs = [1,2,3]
const ys = [1,2,3]
console.log (arrayEqual (xs) (ys))      //=> true
// (1 === 1) && (2 === 2) && (3 === 3)  //=> true

const zs = ['1','2','3']
console.log (arrayEqual (xs) (zs))      //=> false
// (1 === '1')                          //=> false
3 và
// equal :: a -> a -> Bool
const equal = x => y =>
  x === y // notice: triple equal

// arrayEqual :: [a] -> [a] -> Bool
const arrayEqual =
  arrayCompare (equal)

const xs = [1,2,3]
const ys = [1,2,3]
console.log (arrayEqual (xs) (ys))      //=> true
// (1 === 1) && (2 === 2) && (3 === 3)  //=> true

const zs = ['1','2','3']
console.log (arrayEqual (xs) (zs))      //=> false
// (1 === '1')                          //=> false
4. Đối với hầu hết các phần, tất cả những gì chúng tôi làm là gọi
// equal :: a -> a -> Bool
const equal = x => y =>
  x === y // notice: triple equal

// arrayEqual :: [a] -> [a] -> Bool
const arrayEqual =
  arrayCompare (equal)

const xs = [1,2,3]
const ys = [1,2,3]
console.log (arrayEqual (xs) (ys))      //=> true
// (1 === 1) && (2 === 2) && (3 === 3)  //=> true

const zs = ['1','2','3']
console.log (arrayEqual (xs) (zs))      //=> false
// (1 === '1')                          //=> false
5 cho mỗi phần tử trong các mảng đầu vào. Chúng tôi trả lại sớm
// equal :: a -> a -> Bool
const equal = x => y =>
  x === y // notice: triple equal

// arrayEqual :: [a] -> [a] -> Bool
const arrayEqual =
  arrayCompare (equal)

const xs = [1,2,3]
const ys = [1,2,3]
console.log (arrayEqual (xs) (ys))      //=> true
// (1 === 1) && (2 === 2) && (3 === 3)  //=> true

const zs = ['1','2','3']
console.log (arrayEqual (xs) (zs))      //=> false
// (1 === '1')                          //=> false
6 nếu
// equal :: a -> a -> Bool
const equal = x => y =>
  x === y // notice: triple equal

// arrayEqual :: [a] -> [a] -> Bool
const arrayEqual =
  arrayCompare (equal)

const xs = [1,2,3]
const ys = [1,2,3]
console.log (arrayEqual (xs) (ys))      //=> true
// (1 === 1) && (2 === 2) && (3 === 3)  //=> true

const zs = ['1','2','3']
console.log (arrayEqual (xs) (zs))      //=> false
// (1 === '1')                          //=> false
2 do người dùng xác định lại
// equal :: a -> a -> Bool
const equal = x => y =>
  x === y // notice: triple equal

// arrayEqual :: [a] -> [a] -> Bool
const arrayEqual =
  arrayCompare (equal)

const xs = [1,2,3]
const ys = [1,2,3]
console.log (arrayEqual (xs) (ys))      //=> true
// (1 === 1) && (2 === 2) && (3 === 3)  //=> true

const zs = ['1','2','3']
console.log (arrayEqual (xs) (zs))      //=> false
// (1 === '1')                          //=> false
6-nhờ đánh giá ngắn mạch của ________ 19. Vì vậy, có, điều này có nghĩa là bộ so sánh có thể dừng lặp lại sớm và ngăn chặn việc lặp qua phần còn lại của mảng đầu vào khi không cần thiết.


So sánh nghiêm ngặt

Tiếp theo, sử dụng chức năng arrayCompare của chúng tôi, chúng tôi có thể dễ dàng tạo các chức năng khác mà chúng tôi có thể cần. Chúng tôi sẽ bắt đầu với arrayEqual tiểu học

// equal :: a -> a -> Bool
const equal = x => y =>
  x === y // notice: triple equal

// arrayEqual :: [a] -> [a] -> Bool
const arrayEqual =
  arrayCompare (equal)

const xs = [1,2,3]
const ys = [1,2,3]
console.log (arrayEqual (xs) (ys))      //=> true
// (1 === 1) && (2 === 2) && (3 === 3)  //=> true

const zs = ['1','2','3']
console.log (arrayEqual (xs) (zs))      //=> false
// (1 === '1')                          //=> false

Đơn giản như thế. arrayEqual có thể được xác định với arrayCompare và hàm so sánh so sánh

// looseEqual :: a -> a -> Bool
const looseEqual = x => y =>
  x == y // notice: double equal

// arrayLooseEqual :: [a] -> [a] -> Bool
const arrayLooseEqual =
  arrayCompare (looseEqual)

const xs = [1,2,3]
const ys = ['1','2','3']
console.log (arrayLooseEqual (xs) (ys))    //=> true
// (1 == '1') && (2 == '2') && (3 == '3')  //=> true
4 với
// looseEqual :: a -> a -> Bool
const looseEqual = x => y =>
  x == y // notice: double equal

// arrayLooseEqual :: [a] -> [a] -> Bool
const arrayLooseEqual =
  arrayCompare (looseEqual)

const xs = [1,2,3]
const ys = ['1','2','3']
console.log (arrayLooseEqual (xs) (ys))    //=> true
// (1 == '1') && (2 == '2') && (3 == '3')  //=> true
5 bằng cách sử dụng
// looseEqual :: a -> a -> Bool
const looseEqual = x => y =>
  x == y // notice: double equal

// arrayLooseEqual :: [a] -> [a] -> Bool
const arrayLooseEqual =
  arrayCompare (looseEqual)

const xs = [1,2,3]
const ys = ['1','2','3']
console.log (arrayLooseEqual (xs) (ys))    //=> true
// (1 == '1') && (2 == '2') && (3 == '3')  //=> true
6 (cho bình đẳng nghiêm ngặt).

Lưu ý rằng chúng tôi cũng định nghĩa

// looseEqual :: a -> a -> Bool
const looseEqual = x => y =>
  x == y // notice: double equal

// arrayLooseEqual :: [a] -> [a] -> Bool
const arrayLooseEqual =
  arrayCompare (looseEqual)

const xs = [1,2,3]
const ys = ['1','2','3']
console.log (arrayLooseEqual (xs) (ys))    //=> true
// (1 == '1') && (2 == '2') && (3 == '3')  //=> true
7 là chức năng của riêng nó. Điều này nhấn mạnh vai trò của arrayCompare là hàm bậc cao hơn để sử dụng bộ so sánh đơn hàng đầu tiên của chúng tôi trong bối cảnh của một loại dữ liệu khác (mảng).


So sánh lỏng lẻo

Thay vào đó, chúng ta có thể dễ dàng xác định

// looseEqual :: a -> a -> Bool
const looseEqual = x => y =>
  x == y // notice: double equal

// arrayLooseEqual :: [a] -> [a] -> Bool
const arrayLooseEqual =
  arrayCompare (looseEqual)

const xs = [1,2,3]
const ys = ['1','2','3']
console.log (arrayLooseEqual (xs) (ys))    //=> true
// (1 == '1') && (2 == '2') && (3 == '3')  //=> true
9 bằng cách sử dụng
// isArray :: a -> Bool
const isArray =
  Array.isArray

// arrayDeepCompare :: (a -> a -> Bool) -> [a] -> [a] -> Bool
const arrayDeepCompare = f =>
  arrayCompare (a => b =>
    isArray (a) && isArray (b)
      ? arrayDeepCompare (f) (a) (b)
      : f (a) (b))

const xs = [1,[2,[3]]]
const ys = [1,[2,['3']]]
console.log (arrayDeepCompare (equal) (xs) (ys)) //=> false
// (1 === 1) && (2 === 2) && (3 === '3')         //=> false

console.log (arrayDeepCompare (looseEqual) (xs) (ys)) //=> true
// (1 == 1) && (2 == 2) && (3 == '3')                 //=> true
0. Bây giờ khi so sánh
// isArray :: a -> Bool
const isArray =
  Array.isArray

// arrayDeepCompare :: (a -> a -> Bool) -> [a] -> [a] -> Bool
const arrayDeepCompare = f =>
  arrayCompare (a => b =>
    isArray (a) && isArray (b)
      ? arrayDeepCompare (f) (a) (b)
      : f (a) (b))

const xs = [1,[2,[3]]]
const ys = [1,[2,['3']]]
console.log (arrayDeepCompare (equal) (xs) (ys)) //=> false
// (1 === 1) && (2 === 2) && (3 === '3')         //=> false

console.log (arrayDeepCompare (looseEqual) (xs) (ys)) //=> true
// (1 == 1) && (2 == 2) && (3 == '3')                 //=> true
1 (số) với
// isArray :: a -> Bool
const isArray =
  Array.isArray

// arrayDeepCompare :: (a -> a -> Bool) -> [a] -> [a] -> Bool
const arrayDeepCompare = f =>
  arrayCompare (a => b =>
    isArray (a) && isArray (b)
      ? arrayDeepCompare (f) (a) (b)
      : f (a) (b))

const xs = [1,[2,[3]]]
const ys = [1,[2,['3']]]
console.log (arrayDeepCompare (equal) (xs) (ys)) //=> false
// (1 === 1) && (2 === 2) && (3 === '3')         //=> false

console.log (arrayDeepCompare (looseEqual) (xs) (ys)) //=> true
// (1 == 1) && (2 == 2) && (3 == '3')                 //=> true
2 (chuỗi), kết quả sẽ là
// isArray :: a -> Bool
const isArray =
  Array.isArray

// arrayDeepCompare :: (a -> a -> Bool) -> [a] -> [a] -> Bool
const arrayDeepCompare = f =>
  arrayCompare (a => b =>
    isArray (a) && isArray (b)
      ? arrayDeepCompare (f) (a) (b)
      : f (a) (b))

const xs = [1,[2,[3]]]
const ys = [1,[2,['3']]]
console.log (arrayDeepCompare (equal) (xs) (ys)) //=> false
// (1 === 1) && (2 === 2) && (3 === '3')         //=> false

console.log (arrayDeepCompare (looseEqual) (xs) (ys)) //=> true
// (1 == 1) && (2 == 2) && (3 == '3')                 //=> true
3

// looseEqual :: a -> a -> Bool
const looseEqual = x => y =>
  x == y // notice: double equal

// arrayLooseEqual :: [a] -> [a] -> Bool
const arrayLooseEqual =
  arrayCompare (looseEqual)

const xs = [1,2,3]
const ys = ['1','2','3']
console.log (arrayLooseEqual (xs) (ys))    //=> true
// (1 == '1') && (2 == '2') && (3 == '3')  //=> true

So sánh sâu (đệ quy)

Bạn có thể nhận thấy rằng đây chỉ là so sánh nông tho. Chắc chắn giải pháp của Tomáš là "đúng cách ™" bởi vì nó không so sánh sâu, phải không?

Thủ tục arrayCompare của chúng tôi đủ linh hoạt để sử dụng theo cách làm cho một bài kiểm tra bình đẳng sâu sắc trở nên dễ dàng

// isArray :: a -> Bool
const isArray =
  Array.isArray

// arrayDeepCompare :: (a -> a -> Bool) -> [a] -> [a] -> Bool
const arrayDeepCompare = f =>
  arrayCompare (a => b =>
    isArray (a) && isArray (b)
      ? arrayDeepCompare (f) (a) (b)
      : f (a) (b))

const xs = [1,[2,[3]]]
const ys = [1,[2,['3']]]
console.log (arrayDeepCompare (equal) (xs) (ys)) //=> false
// (1 === 1) && (2 === 2) && (3 === '3')         //=> false

console.log (arrayDeepCompare (looseEqual) (xs) (ys)) //=> true
// (1 == 1) && (2 == 2) && (3 == '3')                 //=> true

Đơn giản như thế. Chúng tôi xây dựng một bộ so sánh sâu bằng cách sử dụng một chức năng bậc cao khác. Lần này, chúng tôi sẽ kết thúc arrayCompare bằng cách sử dụng bộ so sánh tùy chỉnh sẽ kiểm tra xem

// looseEqual :: a -> a -> Bool
const looseEqual = x => y =>
  x == y // notice: double equal

// arrayLooseEqual :: [a] -> [a] -> Bool
const arrayLooseEqual =
  arrayCompare (looseEqual)

const xs = [1,2,3]
const ys = ['1','2','3']
console.log (arrayLooseEqual (xs) (ys))    //=> true
// (1 == '1') && (2 == '2') && (3 == '3')  //=> true
4 và
// looseEqual :: a -> a -> Bool
const looseEqual = x => y =>
  x == y // notice: double equal

// arrayLooseEqual :: [a] -> [a] -> Bool
const arrayLooseEqual =
  arrayCompare (looseEqual)

const xs = [1,2,3]
const ys = ['1','2','3']
console.log (arrayLooseEqual (xs) (ys))    //=> true
// (1 == '1') && (2 == '2') && (3 == '3')  //=> true
5 có phải là mảng không. Nếu vậy, hãy áp dụng lại
// isArray :: a -> Bool
const isArray =
  Array.isArray

// arrayDeepCompare :: (a -> a -> Bool) -> [a] -> [a] -> Bool
const arrayDeepCompare = f =>
  arrayCompare (a => b =>
    isArray (a) && isArray (b)
      ? arrayDeepCompare (f) (a) (b)
      : f (a) (b))

const xs = [1,[2,[3]]]
const ys = [1,[2,['3']]]
console.log (arrayDeepCompare (equal) (xs) (ys)) //=> false
// (1 === 1) && (2 === 2) && (3 === '3')         //=> false

console.log (arrayDeepCompare (looseEqual) (xs) (ys)) //=> true
// (1 == 1) && (2 == 2) && (3 == '3')                 //=> true
8 khác so sánh
// looseEqual :: a -> a -> Bool
const looseEqual = x => y =>
  x == y // notice: double equal

// arrayLooseEqual :: [a] -> [a] -> Bool
const arrayLooseEqual =
  arrayCompare (looseEqual)

const xs = [1,2,3]
const ys = ['1','2','3']
console.log (arrayLooseEqual (xs) (ys))    //=> true
// (1 == '1') && (2 == '2') && (3 == '3')  //=> true
4 và
// looseEqual :: a -> a -> Bool
const looseEqual = x => y =>
  x == y // notice: double equal

// arrayLooseEqual :: [a] -> [a] -> Bool
const arrayLooseEqual =
  arrayCompare (looseEqual)

const xs = [1,2,3]
const ys = ['1','2','3']
console.log (arrayLooseEqual (xs) (ys))    //=> true
// (1 == '1') && (2 == '2') && (3 == '3')  //=> true
5 với bộ so sánh do người dùng chỉ định (
// equal :: a -> a -> Bool
const equal = x => y =>
  x === y // notice: triple equal

// arrayEqual :: [a] -> [a] -> Bool
const arrayEqual =
  arrayCompare (equal)

const xs = [1,2,3]
const ys = [1,2,3]
console.log (arrayEqual (xs) (ys))      //=> true
// (1 === 1) && (2 === 2) && (3 === 3)  //=> true

const zs = ['1','2','3']
console.log (arrayEqual (xs) (zs))      //=> false
// (1 === '1')                          //=> false
2). Điều này cho phép chúng ta giữ cho hành vi so sánh sâu xa cách với cách chúng ta thực sự so sánh các yếu tố riêng lẻ. IE, giống như ví dụ trên cho thấy, chúng ta có thể so sánh sâu bằng cách sử dụng
// looseEqual :: a -> a -> Bool
const looseEqual = x => y =>
  x == y // notice: double equal

// arrayLooseEqual :: [a] -> [a] -> Bool
const arrayLooseEqual =
  arrayCompare (looseEqual)

const xs = [1,2,3]
const ys = ['1','2','3']
console.log (arrayLooseEqual (xs) (ys))    //=> true
// (1 == '1') && (2 == '2') && (3 == '3')  //=> true
7,
// arrayDeepEqual :: [a] -> [a] -> Bool
const arrayDeepEqual =
  arrayDeepCompare (equal)

// arrayDeepLooseEqual :: [a] -> [a] -> Bool
const arrayDeepLooseEqual =
  arrayDeepCompare (looseEqual)
3 hoặc bất kỳ bộ so sánh nào khác mà chúng ta thực hiện.

Bởi vì

// isArray :: a -> Bool
const isArray =
  Array.isArray

// arrayDeepCompare :: (a -> a -> Bool) -> [a] -> [a] -> Bool
const arrayDeepCompare = f =>
  arrayCompare (a => b =>
    isArray (a) && isArray (b)
      ? arrayDeepCompare (f) (a) (b)
      : f (a) (b))

const xs = [1,[2,[3]]]
const ys = [1,[2,['3']]]
console.log (arrayDeepCompare (equal) (xs) (ys)) //=> false
// (1 === 1) && (2 === 2) && (3 === '3')         //=> false

console.log (arrayDeepCompare (looseEqual) (xs) (ys)) //=> true
// (1 == 1) && (2 == 2) && (3 == '3')                 //=> true
8 được thực hiện, chúng tôi cũng có thể áp dụng một phần như chúng tôi đã làm trong các ví dụ trước

// arrayDeepEqual :: [a] -> [a] -> Bool
const arrayDeepEqual =
  arrayDeepCompare (equal)

// arrayDeepLooseEqual :: [a] -> [a] -> Bool
const arrayDeepLooseEqual =
  arrayDeepCompare (looseEqual)

Đối với tôi, đây đã là một cải tiến rõ ràng về giải pháp của Tomáš bởi vì tôi có thể chọn một cách rõ ràng một so sánh nông hoặc sâu cho các mảng của tôi, khi cần thiết.


So sánh đối tượng (ví dụ)

Bây giờ điều gì sẽ xảy ra nếu bạn có một loạt các đối tượng hoặc một cái gì đó? Có thể bạn muốn coi các mảng đó là "bằng nhau" nếu mỗi đối tượng có cùng giá trị

// arrayDeepEqual :: [a] -> [a] -> Bool
const arrayDeepEqual =
  arrayDeepCompare (equal)

// arrayDeepLooseEqual :: [a] -> [a] -> Bool
const arrayDeepLooseEqual =
  arrayDeepCompare (looseEqual)
5

// idEqual :: {id: Number} -> {id: Number} -> Bool
const idEqual = x => y =>
  x.id !== undefined && x.id === y.id

// arrayIdEqual :: [a] -> [a] -> Bool
const arrayIdEqual =
  arrayCompare (idEqual)

const xs = [{id:1}, {id:2}]
const ys = [{id:1}, {id:2}]
console.log (arrayIdEqual (xs) (ys)) //=> true
// (1 === 1) && (2 === 2)            //=> true

const zs = [{id:1}, {id:6}]
console.log (arrayIdEqual (xs) (zs)) //=> false
// (1 === 1) && (2 === 6)            //=> false

Đơn giản như thế. Ở đây tôi đã sử dụng các đối tượng vani JS, nhưng loại so sánh này có thể hoạt động cho bất kỳ loại đối tượng nào; Ngay cả các đối tượng tùy chỉnh của bạn. Giải pháp của Tomáš sẽ cần được làm lại hoàn toàn để hỗ trợ loại bài kiểm tra bình đẳng này

Mảng sâu với các đối tượng? Không thành vấn đề. Chúng tôi đã xây dựng các chức năng rất linh hoạt, chung chung, vì vậy chúng sẽ hoạt động trong nhiều trường hợp sử dụng.

const xs = [{id:1}, [{id:2}]]
const ys = [{id:1}, [{id:2}]]
console.log (arrayCompare (idEqual) (xs) (ys))     //=> false
console.log (arrayDeepCompare (idEqual) (xs) (ys)) //=> true

So sánh tùy ý (ví dụ)

Hoặc nếu bạn muốn thực hiện một số loại so sánh hoàn toàn tùy tiện khác? Có lẽ tôi muốn biết nếu mỗi

// arrayDeepEqual :: [a] -> [a] -> Bool
const arrayDeepEqual =
  arrayDeepCompare (equal)

// arrayDeepLooseEqual :: [a] -> [a] -> Bool
const arrayDeepLooseEqual =
  arrayDeepCompare (looseEqual)
6 lớn hơn mỗi
// arrayDeepEqual :: [a] -> [a] -> Bool
const arrayDeepEqual =
  arrayDeepCompare (equal)

// arrayDeepLooseEqual :: [a] -> [a] -> Bool
const arrayDeepLooseEqual =
  arrayDeepCompare (looseEqual)
7

// gt :: Number -> Number -> Bool
const gt = x => y =>
  x > y

// arrayGt :: [a] -> [a] -> Bool
const arrayGt = arrayCompare (gt)

const xs = [5,10,20]
const ys = [2,4,8]
console.log (arrayGt (xs) (ys))     //=> true
// (5 > 2) && (10 > 4) && (20 > 8)  //=> true

const zs = [6,12,24]
console.log (arrayGt (xs) (zs))     //=> false
// (5 > 6)                          //=> false

Càng đơn giản càng đẹp

Bạn có thể thấy chúng tôi thực sự làm nhiều hơn với ít mã hơn. Không có gì phức tạp về chính arrayCompare và mỗi bộ so sánh tùy chỉnh mà chúng tôi đã thực hiện có một triển khai rất đơn giản.

Một cách dễ dàng, chúng ta có thể xác định chính xác cách chúng ta mong muốn hai mảng được so sánh - nông, sâu, nghiêm ngặt, lỏng lẻo, một số thuộc tính đối tượng hoặc một số tính toán tùy ý hoặc bất kỳ sự kết hợp nào của những điều này - tất cả đều sử dụng một quy trình, arrayCompare. Thậm chí có thể mơ lên ​​một bộ so sánh

// idEqual :: {id: Number} -> {id: Number} -> Bool
const idEqual = x => y =>
  x.id !== undefined && x.id === y.id

// arrayIdEqual :: [a] -> [a] -> Bool
const arrayIdEqual =
  arrayCompare (idEqual)

const xs = [{id:1}, {id:2}]
const ys = [{id:1}, {id:2}]
console.log (arrayIdEqual (xs) (ys)) //=> true
// (1 === 1) && (2 === 2)            //=> true

const zs = [{id:1}, {id:6}]
console.log (arrayIdEqual (xs) (zs)) //=> false
// (1 === 1) && (2 === 6)            //=> false
0! Tôi biết những đứa trẻ yêu thích những regexps đó như thế nào…all using one procedure, arrayCompare. Maybe even dream up a
// idEqual :: {id: Number} -> {id: Number} -> Bool
const idEqual = x => y =>
  x.id !== undefined && x.id === y.id

// arrayIdEqual :: [a] -> [a] -> Bool
const arrayIdEqual =
  arrayCompare (idEqual)

const xs = [{id:1}, {id:2}]
const ys = [{id:1}, {id:2}]
console.log (arrayIdEqual (xs) (ys)) //=> true
// (1 === 1) && (2 === 2)            //=> true

const zs = [{id:1}, {id:6}]
console.log (arrayIdEqual (xs) (zs)) //=> false
// (1 === 1) && (2 === 6)            //=> false
0 comparator ! I know how kids love those regexps …

Nó có phải là nhanh nhất? Không. Nhưng nó có lẽ cũng không cần phải. Nếu tốc độ là số liệu duy nhất được sử dụng để đo chất lượng mã của chúng tôi, rất nhiều mã thực sự tuyệt vời sẽ bị vứt đi - đó là lý do tại sao tôi gọi cách tiếp cận này theo cách thực tế. Hoặc có thể công bằng hơn, một cách thiết thực. Mô tả này phù hợp cho câu trả lời này bởi vì tôi không nói câu trả lời này chỉ thực tế so với một số câu trả lời khác; nó là khách quan đúng. Chúng tôi đã đạt được mức độ thực tế cao với rất ít mã rất dễ lý do. Không có mã nào khác có thể nói rằng chúng tôi chưa kiếm được mô tả này.The Practical Way. Or maybe to be more fair, A Practical Way. This description is suitable for this answer because I'm not saying this answer is only practical in comparison to some other answer; it is objectively true. We've attained a high degree of practicality with very little code that's very easy to reason about. No other code can say we haven't earned this description.

Điều đó có làm cho nó là giải pháp "đúng" cho bạn không? Đó là quyết định để bạn quyết định. Và không ai khác có thể làm điều đó cho bạn; Chỉ có bạn biết nhu cầu của bạn là gì. Trong hầu hết các trường hợp, tôi coi trọng mã đơn giản, thực tế và linh hoạt hơn loại thông minh và nhanh chóng. Những gì bạn giá trị có thể khác nhau, vì vậy hãy chọn những gì phù hợp với bạn.


Chỉnh sửa

Câu trả lời cũ của tôi tập trung hơn vào việc phân tách arrayEqual thành các thủ tục nhỏ. Đó là một bài tập thú vị, nhưng không thực sự là cách tốt nhất (thực tế nhất) để tiếp cận vấn đề này. Nếu bạn quan tâm, bạn có thể thấy lịch sử sửa đổi này.

Chúng ta có thể so sánh mảng và chuỗi trong javascript không?

Mặc dù JavaScript không có phương pháp sẵn có để so sánh trực tiếp hai mảng, nhưng nó có các phương pháp sẵn có để so sánh hai chuỗi. Chuỗi cũng có thể được so sánh bằng cách sử dụng toán tử bình đẳng. Do đó, chúng ta có thể chuyển đổi các mảng thành chuỗi, sử dụng phương thức mảng (), sau đó kiểm tra xem các chuỗi có bằng nhau không.JavaScript does not have an inbuilt method to directly compare two arrays, it does have inbuilt methods to compare two strings. Strings can also be compared using the equality operator. Therefore, we can convert the arrays to strings, using the Array join() method, and then check if the strings are equal.

Chúng ta có thể so sánh mảng với chuỗi không?

Tất nhiên, bạn không thể so sánh một mảng chuỗi với một mảng int, điều đó có nghĩa là hai mảng được cho là bằng nhau nếu chúng có cùng loại, có cùng độ dài, chứa cùng một phần tử và theo cùng một thứ tự.Bây giờ, bạn có thể viết phương thức của riêng mình để kiểm tra sự bình đẳng mảng hoặc tận dụng API Bộ sưu tập phong phú của Java.you can't compare a String array to an int array, which means two arrays are said to be equal if they are of the same type, has the same length, contains the same elements, and in the same order. Now, you can write your own method for checking array equality or take advantage of Java's rich Collection API.

Làm cách nào để so sánh các chuỗi trong một mảng?

Bạn có thể so sánh các mảng chuỗi cho sự bình đẳng với các toán tử quan hệ == và ~ =.Khi bạn so sánh các mảng chuỗi, đầu ra là một mảng logic có 1 trong đó mối quan hệ là đúng và 0 trong đó nó không đúng.with the relational operators == and ~= . When you compare string arrays, the output is a logical array that has 1 where the relation is true, and 0 where it is not true.

Làm thế nào để bạn kiểm tra xem một chuỗi nằm trong một mảng javascript?

Bạn có thể sử dụng phương thức bao gồm () trong JavaScript để kiểm tra xem một mục có tồn tại trong một mảng không.Bạn cũng có thể sử dụng nó để kiểm tra xem một chuỗi con có tồn tại trong một chuỗi không.Nó trả về true nếu mục được tìm thấy trong mảng/chuỗi và sai nếu mục không tồn tại.use the includes() method in JavaScript to check if an item exists in an array. You can also use it to check if a substring exists within a string. It returns true if the item is found in the array/string and false if the item doesn't exist.