Tổng số tích cực codewars javascript

Đơ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 tra

Lư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