Đơn giản, đó là vì hàm Array.prototype.sort
trong javascript sửa đổi nội dung thực tế của cùng một thể hiện của mảng cũng như trả về tham chiếu cho cùng một mảng, Nói cách khác, nó không trả về một mảng mới với nội dung đã sửa đổi, nó sửa đổi . Đó là lý do tại sao nó không hoạt động khi bạn xóa dòng
const m = numbers.sort[ [a, b] => a - b ][2];
Nhưng, tại sao nó không hoạt động khi bạn cố đặt logic tương tự với dòng mã tiếp theo?
const a = numbers.filter[v => v < numbers.sort[ [a, b] => a - b ][2]];
Sự cố xảy ra khi giá trị nhỏ nhất của mảng nằm ở chỉ số lớn hơn 2 chẳng hạn
[ 15, 28, 4, 2, 43 ]
khi chúng ta cố gắng thực thi mã trên mảng này, hãy thực hiện từng bước một để biết sai ở đâu
function sumTwoSmallestNumbers[numbers] {
const a = numbers.filter[v => v < numbers.sort[ [a, b] => a - b ][2]];
const b = a.reduce[ [acc, n] => acc + n];
return b
};
const arr = [ 15, 28, 4, 2, 43 ]
const result = sumTwoSmallestNumbers[arr]
console.log[result]
Khi thực thi mã trước đó, điều đầu tiên mà hàm sẽ thực hiện là lọc. Nó sẽ lặp qua các phần tử của mảng
Bắt đầu từ chỉ số 0 => arr[0] = 15
Kiểm tra điều kiện.
15 < numbers.sort[ [a, b] => a - b ][2]
=> [15 < 15] => sai
Lưu ý. như tôi đã giải thích trước đó, rằng hàm sắp xếp sẽ thay đổi mảng thực thay vì tạo một mảng mới, điều đó có nghĩa là khi thử kiểm tra điều kiện lần đầu tiên, mảng sẽ được sắp xếp, có nghĩa là nếu nó chưa được sắp xếp,
Trước khi tiếp tục lặp lại filter
, hãy làm rõ rằng thứ tự mới của mảng sau khi sắp xếp đã được thực hiện khi cố gắng kiểm tra điều kiện như sau
[ 2, 4, 15, 28, 43 ]
- Chỉ mục 1 => mảng[1] = 4
Kiểm tra điều kiện.
4 < numbers.sort[ [a, b] => a - b ][2]
=> [4 < 15] => đúng - Chỉ mục 2 => mảng[2] = 15
Kiểm tra điều kiện.
15 < numbers.sort[ [a, b] => a - b ][2]
=> [15 < 15] => sai - Các yếu tố còn lại
Phần kết luận
Như bạn có thể nhận thấy, giá trị
const a = numbers.filter[v => v < numbers.sort[ [a, b] => a - b ][2]];
1 đã được kiểm tra hai lần và giá trị const a = numbers.filter[v => v < numbers.sort[ [a, b] => a - b ][2]];
2 hoàn toàn không được kiểm tra, đó là do sự thay đổi đột ngột về thứ tự của mảng trong quá trình lặp lại hiện đang diễn ra của phương thức filter
. Điều này đã dẫn đến việc đặt giá trị của const a = numbers.filter[v => v < numbers.sort[ [a, b] => a - b ][2]];
2 vào một vị trí đã được kiểm tra và giá trị của const a = numbers.filter[v => v < numbers.sort[ [a, b] => a - b ][2]];
1 vào một vị trí chưa được kiểm traLưu ý Đây không phải là một giải pháp tối ưu cho một vấn đề như vậy, nó thực hiện quá nhiều công việc để có được giải pháp, [lọc, sắp xếp, rút gọn], đây là những thao tác tốn kém để thực hiện. Một giải pháp tốt hơn sẽ giống như thế này, bao gồm một vòng lặp duy nhất thông qua các phần tử của mảng
const a = numbers.filter[v => v < numbers.sort[ [a, b] => a - b ][2]];
6 Tạo một hàm trả về tổng của hai số dương nhỏ nhất cho một mảng gồm 4 số nguyên dương nhỏ nhất. Không có số float hoặc số nguyên không dương nào được chuyển
Ví dụ
Đầu vào -> [19, 5, 42, 2, 77]
Đầu ra -> 7Đầu vào -> [10, 343445353, 3453445, 3453545353453]
Đầu ra -> 3453455
Giải pháp của tôi
function sumTwoSmallestNumbers[numbers] {
let first = Math.min[...numbers]
numbers.splice[numbers.indexOf[first], 1]
let second = Math.min[...numbers]
return first + second
}
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Giải trình
Đầu tiên tôi sử dụng Toán. min[] với các giá trị mảng để tôi có thể lấy số nhỏ nhất đầu tiên
để trước = Toán. tối thiểu [. số]
Sau đó, tôi ghép số đầu tiên, vì vậy khi tôi sử dụng Toán. min[] một lần nữa tôi sẽ lấy phần tử thứ hai
con số. mối nối [số. indexOf[đầu tiên], 1]
để thứ hai = Toán. tối thiểu [. số]
Cuối cùng, tôi chỉ trả về tổng của số thứ nhất và số thứ hai
trở lại đầu tiên + thứ hai
Bạn nghĩ gì về giải pháp này?
Github của tôi
Twitter của tôi
Giải bài Kata này