Array.prototype.reverse
đảo ngược nội dung của một mảng tại chỗ (có đột biến) ...
Có một chiến lược đơn giản tương tự để đảo ngược một mảng mà không làm thay đổi nội dung của mảng ban đầu (không có đột biến) không?
Array.prototype.reverse
đảo ngược nội dung của một mảng tại chỗ (có đột biến) ...
Có một chiến lược đơn giản tương tự để đảo ngược một mảng mà không làm thay đổi nội dung của mảng ban đầu (không có đột biến) không?
Câu trả lời:
Bạn có thể sử dụng lát () để tạo một bản sao rồi đảo ngược () nó
var newarray = array.slice().reverse();
Trong ES6:
const newArray = [...array].reverse()
[...].reverse
lợi thế trong trường hợp thử nghiệm rất đơn giản. jsperf.com/reverse-vs-slice-reverse/1
.slice
nhanh hơn đáng kể.
slice
có khả năng nhanh hơn b / c [...]
là một mảng lặp có thể lặp chung nên không thể đưa ra nhiều giả định. Đồng thời, nó có khả năng slice
được tối ưu hóa tốt hơn bởi vì nó đã xuất hiện từ lâu.
Một biến thể ES6 khác:
Chúng ta cũng có thể sử dụng .reduceRight()
để tạo ra một mảng đảo ngược mà không thực sự đảo ngược nó.
let A = ['a', 'b', 'c', 'd', 'e', 'f'];
let B = A.reduceRight((a, c) => (a.push(c), a), []);
console.log(B);
Tài nguyên hữu ích:
reduceRight
chậm af
(a, c) => a.concat([c])
cảm thấy thành ngữ hơn(a, c) => (a.push(c), a)
Hãy thử giải pháp đệ quy này:
const reverse = ([head, ...tail]) =>
tail.length === 0
? [head] // Base case -- cannot reverse a single element.
: [...reverse(tail), head] // Recursive case
reverse([1]); // [1]
reverse([1,2,3]); // [3,2,1]
reverse('hello').join(''); // 'olleh' -- Strings too!
Một thay thế ES6 sử dụng .reduce()
và lan rộng.
const foo = [1, 2, 3, 4];
const bar = foo.reduce((acc, b) => ([b, ...acc]), []);
Về cơ bản những gì nó làm là tạo ra một mảng mới với phần tử tiếp theo trong foo và trải rộng mảng tích lũy cho mỗi lần lặp sau b.
[]
[1] => [1]
[2, ...[1]] => [2, 1]
[3, ...[2, 1]] => [3, 2, 1]
[4, ...[3, 2, 1]] => [4, 3, 2, 1]
Hoặc .reduceRight()
như đã đề cập ở trên, nhưng không có .push()
đột biến.
const baz = foo.reduceRight((acc, b) => ([...acc, b]), []);
Có nhiều cách để đảo ngược một mảng mà không sửa đổi. Hai trong số họ là
var array = [1,2,3,4,5,6,7,8,9,10];
// Using Splice
var reverseArray1 = array.splice().reverse(); // Fastest
// Using spread operator
var reverseArray2 = [...array].reverse();
// Using for loop
var reverseArray3 = [];
for(var i = array.length-1; i>=0; i--) {
reverseArray.push(array[i]);
}
Kiểm tra hiệu suất http://jsben.ch/guftu
VÀO Javascript đơn giản:
function reverseArray(arr, num) {
var newArray = [];
for (let i = num; i <= arr.length - 1; i++) {
newArray.push(arr[i]);
}
return newArray;
}
Đảo ngược tại chỗ với hoán đổi biến đổi chỉ nhằm mục đích trình diễn (nhưng bạn cần một bản sao nếu bạn không muốn thay đổi)
const myArr = ["a", "b", "c", "d"];
const copy = [...myArr];
for (let i = 0; i < (copy.length - 1) / 2; i++) {
const lastIndex = copy.length - 1 - i;
[copy[i], copy[lastIndex]] = [copy[lastIndex], copy[i]]
}
es6:
const reverseArr = [1,2,3,4].sort(()=>1)
1
cuối cùng có thể là bất cứ thứ gì lớn hơn 0, bởi vì đó là cách Array.prototype.sort
gọi lại (hay còn gọi là compare function
) hoạt động. Về cơ bản, bạn luôn so sánh 2 số và trong trường hợp này, giá trị so sánh luôn luôn dương, do đó, nó luôn luôn chuyển sang số thứ hai trước số thứ nhất :) điều này rất dễ giải thích: stackoverflow.com/questions/6567941/
sort()
làm thay đổi mảng (nghĩa là sắp xếp nó đúng chỗ), đó là điều mà OP muốn tránh.