Array.prototype.reverse
ย้อนกลับเนื้อหาของอาร์เรย์ในสถานที่ (กับการกลายพันธุ์) ...
มีกลยุทธ์อย่างง่าย ๆ ที่คล้ายกันสำหรับการย้อนกลับอาร์เรย์โดยไม่มีการเปลี่ยนแปลงเนื้อหาของอาร์เรย์เดิม (โดยไม่มีการเปลี่ยนแปลง) หรือไม่?
Array.prototype.reverse
ย้อนกลับเนื้อหาของอาร์เรย์ในสถานที่ (กับการกลายพันธุ์) ...
มีกลยุทธ์อย่างง่าย ๆ ที่คล้ายกันสำหรับการย้อนกลับอาร์เรย์โดยไม่มีการเปลี่ยนแปลงเนื้อหาของอาร์เรย์เดิม (โดยไม่มีการเปลี่ยนแปลง) หรือไม่?
คำตอบ:
คุณสามารถใช้slice ()เพื่อทำสำเนาจากนั้นย้อนกลับ ()ได้
var newarray = array.slice().reverse();
If begin is omitted, slice begins from index 0.
- ดังนั้นจึงเป็นเช่นเดียวกับarray.slice(0)
ใน ES6:
const newArray = [...array].reverse()
[...].reverse
ขอบในกรณีทดสอบที่ง่ายมาก jsperf.com/reverse-vs-slice-reverse/1
.slice
เร็วขึ้นอย่างต่อเนื่องอย่างมีนัยสำคัญ
slice
มีแนวโน้มที่จะเร็วขึ้น b / c [...]
เป็น iterable-to-array ทั่วไปดังนั้นจึงไม่สามารถตั้งสมมติฐานได้มากนัก รวมถึงมีแนวโน้มที่slice
จะเพิ่มประสิทธิภาพ b / c ที่ดีขึ้นมาเป็นเวลานาน
ตัวแปร ES6 อื่น:
นอกจากนี้เรายังสามารถใช้.reduceRight()
เพื่อสร้างอาร์เรย์ที่กลับด้านได้โดยไม่ต้องย้อนกลับ
let A = ['a', 'b', 'c', 'd', 'e', 'f'];
let B = A.reduceRight((a, c) => (a.push(c), a), []);
console.log(B);
ทรัพยากรที่มีประโยชน์:
reduceRight
ช้ามาก
(a, c) => a.concat([c])
รู้สึกสำนวนมากกว่า(a, c) => (a.push(c), a)
ลองวิธีแก้ปัญหาซ้ำนี้:
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!
ทางเลือก ES6 ที่ใช้.reduce()
และกระจาย
const foo = [1, 2, 3, 4];
const bar = foo.reduce((acc, b) => ([b, ...acc]), []);
โดยทั่วไปสิ่งที่มันทำคือสร้างอาร์เรย์ใหม่ด้วยองค์ประกอบถัดไปใน foo และกระจายอาร์เรย์สะสมสำหรับแต่ละการวนซ้ำหลังจาก b
[]
[1] => [1]
[2, ...[1]] => [2, 1]
[3, ...[2, 1]] => [3, 2, 1]
[4, ...[3, 2, 1]] => [4, 3, 2, 1]
อีกทางเลือกหนึ่ง.reduceRight()
ดังกล่าวข้างต้นที่นี่ แต่ไม่มีการ.push()
กลายพันธุ์
const baz = foo.reduceRight((acc, b) => ([...acc, b]), []);
มีหลายวิธีในการย้อนกลับอาร์เรย์โดยไม่ต้องแก้ไข สองของพวกเขาคือ
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]);
}
การทดสอบประสิทธิภาพhttp://jsben.ch/guftu
จาวาสคริปต์ธรรมดาใน:
function reverseArray(arr, num) {
var newArray = [];
for (let i = num; i <= arr.length - 1; i++) {
newArray.push(arr[i]);
}
return newArray;
}
การย้อนกลับโดยใช้การสลับผันแปรเพียงเพื่อจุดประสงค์ในการสาธิต (แต่คุณต้องการสำเนาหากคุณไม่ต้องการที่จะกลายพันธุ์)
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
ท้ายที่สุดอาจเป็นอะไรที่มากกว่าศูนย์เพราะนั่นเป็นวิธีการArray.prototype.sort
โทรกลับ (หรือเรียกอีกอย่างหนึ่งcompare function
) โดยทั่วไปคุณจะเปรียบเทียบตัวเลข 2 ตัวเสมอและในกรณีนี้การเปรียบเทียบจะส่งกลับค่าเป็นบวกเสมอดังนั้นจึงบอกว่าให้ย้ายไปยังหมายเลขที่สองที่อยู่ด้านหน้าของหมายเลขแรกเสมอ :) นี่เป็นคำอธิบายที่ดีมาก: stackoverflow.com/questions/6567941/ …
sort()
กลายพันธุ์อาร์เรย์ (เช่นเรียงลำดับในสถานที่) ซึ่งเป็นสิ่งที่ OP ต้องการหลีกเลี่ยง