.slice()
và .splice()
là các phương thức tương tự trong JavaScript. Chúng trông giống nhau, âm thanh giống nhau và chúng làm những việc giống nhau. Vì những lý do đó, điều quan trọng là phải biết sự khác biệt giữa chúng. Ngoài ra, chúng được sử dụng rất thường xuyên, vì vậy việc hiểu cách sử dụng chúng là điều tốt để tìm hiểu sớm đối với bất kỳ nhà phát triển phần mềm nào.
Trong bài viết này, chúng ta sẽ xem xét cách sử dụng chúng với một thử thách kịch bản thuật toán cụ thể. Chúng ta sẽ chèn các phần tử từ mảng này sang mảng khác và trả về mảng kết hợp mà không làm thay đổi mảng ban đầu.
hướng dẫn thuật toán
Bạn được cung cấp hai mảng và một chỉ mục.
Sử dụng các phương thức mảng
slice
vàsplice
để sao chép từng phần tử của mảng thứ nhất vào mảng thứ hai, theo thứ tự.
Bắt đầu chèn các phần tử vào chỉ mục
n
của mảng thứ hai.
Trả về mảng kết quả. Các mảng đầu vào sẽ giữ nguyên sau khi chức năng chạy.
function frankenSplice(arr1, arr2, n) {
return arr2;
}
frankenSplice([1, 2, 3], [4, 5, 6], 1);
Các trường hợp thử nghiệm được cung cấp
frankenSplice([1, 2, 3], [4, 5], 1)
nên trở lại[4, 1, 2, 3, 5]
.frankenSplice([1, 2], ["a", "b"], 1)
nên trở lại["a", 1, 2, "b"]
.frankenSplice(["claw", "tentacle"], ["head", "shoulders", "knees", "toes"], 2)
nên trở lại["head", "shoulders", "claw", "tentacle", "knees", "toes"]
.- Tất cả các phần tử từ mảng đầu tiên phải được thêm vào mảng thứ hai theo thứ tự ban đầu của chúng.
- Mảng đầu tiên sẽ giữ nguyên sau khi hàm chạy.
- Mảng thứ hai sẽ giữ nguyên sau khi hàm chạy.
Giải pháp #1: .slice(), .splice() và toán tử trải rộng
PEDAC
Hiểu vấn đề: Chúng tôi có một đầu vào, một chuỗi. Đầu ra của chúng tôi cũng là một chuỗi. Cuối cùng, chúng tôi muốn trả về chuỗi đầu vào với chữ cái đầu tiên — và chỉ chữ cái đầu tiên — của mỗi từ được viết hoa.
Ví dụ/Trường hợp thử nghiệm: Các trường hợp thử nghiệm được cung cấp của chúng tôi cho thấy rằng chúng tôi chỉ nên viết hoa một chữ cái ở đầu mỗi từ. Chúng ta cần viết thường phần còn lại. Các trường hợp thử nghiệm được cung cấp cũng cho thấy rằng chúng tôi không bị ném bất kỳ quả bóng cong nào về các từ ghép kỳ lạ được phân tách bằng ký hiệu thay vì khoảng trắng. Đó là tin tốt cho chúng tôi!
Cấu trúc dữ liệu: Chúng ta sẽ phải chuyển đổi chuỗi đầu vào của mình thành một mảng để thao tác riêng với từng từ.
Hãy trò chuyện một chút về .slice()
và .splice()
:
Trước tiên hãy giải quyết .slice()
:
.slice()
trích xuất một phần của chuỗi và trả về dưới dạng một chuỗi mới. Nếu bạn gọi .slice()
trên một chuỗi mà không chuyển cho nó bất kỳ thông tin bổ sung nào, nó sẽ trả về toàn bộ chuỗi.
"Bastian".slice()
// returns "Bastian"
Điều này sẽ hữu ích cho chúng tôi trong thử thách viết kịch bản thuật toán này vì các hướng dẫn cho chúng tôi biết rằng chúng tôi không nên sửa đổi trực tiếp các mảng đầu vào. Vì vậy, chúng ta sẽ cần tạo một bản sao của một trong số chúng.
Bây giờ chúng ta hãy nhìn vào .splice()
:
.splice()
thay đổi nội dung của một mảng bằng cách loại bỏ hoặc thay thế các phần tử hiện có và/hoặc thêm các phần tử mới.
chúng ta có thể vượt qua .splice()
một số đối số xác định nơi bắt đầu xóa, xóa bao nhiêu và những gì được chèn vào. start
là một con số cho biết .splice()
tại chỉ mục nào để bắt đầu xóa các phần tử. deleteCount
kể .splice()
có bao nhiêu yếu tố để xóa.
Đợi một chút! Nếu bạn không muốn xóa bất cứ thứ gì thì sao? Nếu bạn chỉ muốn chèn các phần tử thì sao? Tốt rồi. Chỉ cần đặt deleteCount
về không. Bây giờ chúng ta có thể bắt đầu thêm các mục. Chỉ cần tách từng phần tử bằng dấu phẩy, như vậy item1, item2, item3, item4
.
.splice(start, deleteCount, item1, item2, item3, etc.)
Một khái niệm khác cần ghi nhớ cho thử thách viết kịch bản thuật toán này là toán tử trải rộng. ES6 đã tặng chúng tôi toán tử trải rộng trông giống như hình elip – chỉ ba dấu chấm liên tiếp.
Toán tử trải rộng được sử dụng phổ biến nhất khi bạn muốn sử dụng các phần tử của một mảng làm đối số cho một hàm. Đó chính xác là những gì chúng ta sẽ làm với nó trong thử thách này. Chúng tôi không muốn chèn toàn bộ mảng arr1
vào trong arr2
. Chúng tôi muốn chèn từng phần tử của arr1
vào trong arr2
.
thuật toán:
- Tạo một bản sao của
arr2
. - Chèn tất cả các phần tử của
arr1
vào trongarr2
bắt đầu từ chỉ mục trongarr2
theo quy định củan
. - Trả về các mảng kết hợp.
Mã số: Xem bên dưới!
function frankenSplice(arr1, arr2, n) {
// Create a copy of arr2.
let combinedArrays = arr2.slice()
// [4, 5, 6]
// Insert all the elements of arr1 into arr2 beginning
// at the index specified by n. We're using the spread
// operator "..." to insert each individual element of
// arr1 instead of the whole array.
combinedArrays.splice(n, 0, ...arr1)
// (1, 0, ...[1, 2, 3])
// [4, 1, 2, 3, 5, 6]
// Return the combined arrays.
return combinedArrays
}
frankenSplice([1, 2, 3], [4, 5, 6], 1);
Không có ý kiến:
function frankenSplice(arr1, arr2, n) {
let combinedArrays = arr2.slice()
combinedArrays.splice(n, 0, ...arr1)
return combinedArrays
}
frankenSplice([1, 2, 3], [4, 5, 6], 1);
Giải pháp #2: .slice(), .splice() và vòng lặp for
PEDAC
Hiểu vấn đề: Chúng tôi có một đầu vào, một chuỗi. Đầu ra của chúng tôi cũng là một chuỗi. Cuối cùng, chúng tôi muốn trả về chuỗi đầu vào với chữ cái đầu tiên — và chỉ chữ cái đầu tiên — của mỗi từ được viết hoa.
Ví dụ/Trường hợp thử nghiệm: Các trường hợp thử nghiệm được cung cấp của chúng tôi cho thấy rằng chúng tôi chỉ nên viết hoa một chữ cái ở đầu mỗi từ. Chúng ta cần viết thường phần còn lại. Các trường hợp thử nghiệm được cung cấp cũng cho thấy rằng chúng tôi không bị ném bất kỳ quả bóng cong nào về các từ ghép kỳ lạ được phân tách bằng ký hiệu thay vì khoảng trắng. Đó là tin tốt cho chúng tôi!
Cấu trúc dữ liệu: Chúng ta sẽ phải chuyển đổi chuỗi đầu vào của mình thành một mảng để thao tác riêng với từng từ.
Hãy trò chuyện một chút về .slice()
và .splice()
:
Trước tiên hãy giải quyết .slice()
:
.slice()
trích xuất một phần của chuỗi và trả về dưới dạng một chuỗi mới. Nếu bạn gọi .slice()
trên một chuỗi mà không chuyển cho nó bất kỳ thông tin bổ sung nào, nó sẽ trả về toàn bộ chuỗi.
"Bastian".slice()
// returns "Bastian"
Điều này sẽ hữu ích cho chúng tôi trong thử thách viết kịch bản thuật toán này vì các hướng dẫn cho chúng tôi biết rằng chúng tôi không nên sửa đổi trực tiếp các mảng đầu vào. Vì vậy, chúng ta sẽ cần tạo một bản sao của một trong số chúng.
Bây giờ chúng ta hãy nhìn vào .splice()
:
.splice()
thay đổi nội dung của một mảng bằng cách loại bỏ hoặc thay thế các phần tử hiện có và/hoặc thêm các phần tử mới.
chúng ta có thể vượt qua .splice()
một số đối số xác định nơi bắt đầu xóa, xóa bao nhiêu và những gì được chèn vào. start
là một con số cho biết .splice()
tại chỉ mục nào để bắt đầu xóa các phần tử. deleteCount
kể .splice()
có bao nhiêu yếu tố để xóa. Đợi một chút! Nếu bạn không muốn xóa bất cứ thứ gì thì sao? Nếu bạn chỉ muốn chèn các phần tử thì sao? Tốt rồi. Chỉ cần đặt deleteCount
về không. Bây giờ chúng ta có thể bắt đầu thêm các mục. Chỉ cần tách từng phần tử bằng dấu phẩy, như vậy item1, item2, item3, item4
.
.splice(start, deleteCount, item1, item2, item3, etc.)
Không giống như trong giải pháp trước, chúng tôi sẽ không sử dụng toán tử trải rộng ở đây. Thay vào đó, chúng ta sẽ sử dụng vòng lặp for để lấy từng phần tử một từ arr1
và chèn chúng vào arr2
.
Bí quyết ở đây là tăng n
bằng 1 mỗi khi vòng lặp chạy nếu không các phần tử của arr1
sẽ không kết thúc theo đúng thứ tự khi được chèn vào arr2
.
thuật toán:
- Tạo một bản sao của
arr2
. - Sử dụng vòng lặp for, chèn từng phần tử của
arr1
vào trongarr2
bắt đầu từ chỉ mụcn
. - Tăng
n
bằng 1 mỗi khi vòng lặp chạy. - Trả về các mảng kết hợp.
Mã số: Xem bên dưới!
function frankenSplice(arr1, arr2, n) {
// Create a copy of arr2.
let combinedArrays = arr2.slice()
// Using a for loop, insert each element of arr1
// into combinedArrays starting at index n.
for (let i = 0; i < arr1.length; i++) {
combinedArrays.splice(n, 0, arr1[i])
// [4, 5, 6].splice(1, 0, 1)
// [4, 1, 5, 6].splice(2, 0, 2)
// [4, 1, 2, 5, 6].splice(3, 0, 3)
// [4, 1, 2, 3, 5, 6]
// increment n by 1 each time the loop runs
n++
}
// Return the combined arrays.
return combinedArrays
}
frankenSplice([1, 2, 3], [4, 5, 6], 1);
Không có ý kiến:
function frankenSplice(arr1, arr2, n) {
let combinedArrays = arr2.slice()
for (let i = 0; i < arr1.length; i++) {
combinedArrays.splice(n, 0, arr1[i])
n++
}
return combinedArrays
}
frankenSplice([1, 2, 3], [4, 5, 6], 1);
Nếu bạn có các giải pháp và/hoặc đề xuất khác, vui lòng chia sẻ trong phần bình luận!
Bài viết này là một phần của loạt bài FreeCodeCamp Algorithm Scripting.
Bài viết này tham khảo FreeCodeCamp Basic Algorithm Scripting: Slice and Splice
Bạn có thể theo dõi tôi trên Medium, LinkedIn và GitHub!