มีวิธีใช้ map () บนอาร์เรย์ในลำดับย้อนกลับด้วย javascript หรือไม่?


100

ฉันต้องการใช้map()ฟังก์ชันบนอาร์เรย์จาวาสคริปต์ แต่ฉันต้องการให้มันทำงานในลำดับย้อนกลับ

เหตุผลคือฉันกำลังแสดงองค์ประกอบ React แบบเรียงซ้อนในโครงการ Meteor และต้องการให้องค์ประกอบระดับบนสุดแสดงผลก่อนในขณะที่ส่วนที่เหลือโหลดรูปภาพด้านล่าง

var myArray = ['a', 'b', 'c', 'd', 'e'];
myArray.map(function (el, index, coll) {
    console.log(el + " ")
});

พิมพ์ออกมาa b c d eแต่ฉันหวังว่าจะมี mapReverse () ที่พิมพ์ออกมาe d c b a

ข้อเสนอแนะใด ๆ ?


2
ทำไมคุณไม่reverseใช้อาร์เรย์
John

2
ในการจัดลำดับองค์ประกอบฉันตั้งค่าดัชนี z ตามดัชนีอาร์เรย์ ฉันคิดว่าฉันสามารถตั้งค่าดัชนี z ให้เป็นลบได้
Robin Newhouse

ฟังดูเป็นความคิดที่ดี
John

หมายเหตุด้านข้างคุณใช้อาร์เรย์ที่mapส่งคืนจริงหรือไม่? forEachมิฉะนั้นคุณควรจะพิจารณา
ศีล

1
คุณสามารถเข้าถึงองค์ประกอบย้อนกลับภายในการเรียกกลับแผนที่:console.log(coll[coll.length - index - 1] + " ")
le_m

คำตอบ:


159

หากคุณไม่ต้องการย้อนกลับอาร์เรย์เดิมคุณสามารถสร้างสำเนาตื้น ๆ จากนั้นแมปอาร์เรย์ที่กลับด้าน

myArray.slice(0).reverse().map(function(...

ฉันลงเอยด้วยการใช้ดัชนีเชิงลบเพื่อระบุดัชนี z แต่ในวิธีที่ฉันกำหนดคำถามนี้ถูกต้องที่สุด
Robin Newhouse

3
ทำไมเราถึงต้องการ. slice (0)? ทำไมไม่ myArray.reverse () แทนที่จะเป็น myArray.slice (0) .reverse ()? ดูเหมือนว่าคำตอบสำหรับความคิดเห็นของฉันอยู่ที่นี่: stackoverflow.com/questions/5024085/…
Haradzieniec

Haradzieniec - มันไปพร้อมกับรายละเอียดเกี่ยวกับวิธีการกำหนดกรอบคำถามเดิมโดยที่การสั่งซื้อเดิมจำเป็นต้องตั้งค่าคุณสมบัติ Z-index css แต่พิมพ์กลับด้าน
AdamCooper86

slice(0)ไม่จำเป็นต้องเป็นreverse()ผลตอบแทนอาร์เรย์ใหม่และไม่ได้ปรับเปลี่ยนอาร์เรย์ปัจจุบัน @ AdamCooper86 ฉันหวังว่าคุณจะเปลี่ยนสิ่งนั้น
Fahd Lihidheb

6
@FahdLihidheb reverse()แก้ไขอาร์เรย์เดิม
Ferus

20

ไม่เปลี่ยนอาร์เรย์เลยนี่คือโซลูชัน O (n) หนึ่งบรรทัดที่ฉันคิดขึ้น:

myArray.map((val, index, array) => array[array.length - 1 - index]);

valไม่ได้ใช้ที่นี่ดังนั้นฉันไม่คิดว่านี่คือสิ่งที่ OP กำลังมองหา? (ยังคงเป็นทางออกที่ดี)
Paul Razvan Berg

นอกจากนี้อาร์กิวเมนต์ที่ 3 ของ map () คืออาร์เรย์เอง
Knut

19

คุณสามารถใช้ได้ Array.prototype.reduceRight()

var myArray = ["a", "b", "c", "d", "e"];
var res = myArray.reduceRight(function (arr, last, index, coll) {
    console.log(last, index);
    return (arr = arr.concat(last))
}, []);
console.log(res, myArray)


noice (หากคุณต้องการทำการลดอย่างใดอย่างหนึ่ง) - MDN: วิธีการลด () ใช้ฟังก์ชันกับตัวสะสมและแต่ละค่าของอาร์เรย์ (จากขวาไปซ้าย) เพื่อลดค่าเป็นค่าเดียว
TamusJRoyce

8

ด้วยฟังก์ชันการเรียกกลับชื่อ

const items = [1, 2, 3]; 
const reversedItems = items.map(function iterateItems(item) {
  return item; // or any logic you want to perform
}).reverse();

ชวเลข (ไม่มีฟังก์ชันเรียกกลับที่ตั้งชื่อ) - Arrow Syntax, ES6

const items = [1, 2, 3];
const reversedItems = items.map(item => item).reverse();

นี่คือผลลัพธ์

ใส่คำอธิบายภาพที่นี่


แผนที่ถูกใช้เป็นสำเนาตื้น
TamusJRoyce

7

วิธีอื่นอาจเป็น:

const reverseArray = (arr) => arr.map((_, idx, arr) => arr[arr.length - 1 - idx ]);

โดยทั่วไปคุณทำงานกับดัชนีอาร์เรย์


2
ดูเหมือนจะเป็นวิธีที่แปลก แต่วิธีการ ReduceRight ก็แปลกเช่นกันหากคุณต้องการเข้าถึงดัชนีนอกเหนือจากองค์ประกอบไม่ต้องการลดขนาดเป็นต้นในกรณีของฉันนี่คือ น้ำยาที่สะอาดที่สุด
RealHandy

1
หากคุณต้องการทำงานเพิ่มเติมในแผนที่การใช้ arr [... ] ไม่จำเป็นต้องใช้สำเนาที่สองหรือจัดการอาร์เรย์เดิม ลืมเกี่ยวกับพารามิเตอร์ที่ 3 สิ่งที่ฉันกำลังมองหา!
TamusJRoyce

6

ฉันชอบเขียนฟังก์ชัน mapReverse หนึ่งครั้งแล้วจึงใช้ ไม่จำเป็นต้องคัดลอกอาร์เรย์

function mapReverse(array, fn) {
    return array.reduceRight(function (result, el) {
        result.push(fn(el));
        return result;
    }, []);
}

console.log(mapReverse([1, 2, 3], function (i) { return i; }))
// [ 3, 2, 1 ]
console.log(mapReverse([1, 2, 3], function (i) { return i * 2; }))
// [ 6, 4, 2 ]

1
function mapRevers(reverse) {
    let reversed = reverse.map( (num,index,reverse) => reverse[(reverse.length-1)-index] );
    return reversed;
}

console.log(mapRevers(myArray));

ฉันส่งอาร์เรย์เพื่อแมป Revers และในฟังก์ชันที่คุณส่งคืนอาร์เรย์ที่ย้อนกลับ ในแผนที่ cb คุณเพียงแค่นำค่าที่มีดัชนีนับจาก 10 (ความยาว) ลงมาเป็น 1 จากอาร์เรย์ที่ส่งผ่าน


คำอธิบายเป็นลายลักษณ์อักษรว่าโค้ดนี้กำลังทำอะไรอยู่อาจเป็นประโยชน์
Pro Q

0

นี่คือโซลูชัน TypeScript ของฉันที่มีทั้ง O (n) และมีประสิทธิภาพมากกว่าโซลูชันอื่น ๆ โดยการป้องกันไม่ให้รันผ่านอาร์เรย์สองครั้ง:

function reverseMap<T, O>(arg: T[], fn: (a: T) => O) {
   return arg.map((_, i, arr) => fn(arr[arr.length - i - 1]))
}

ใน JavaScript:

const reverseMap = (arg, fn) => arg.map((_, i, arr) => fn(arr[arr.length - 1 - i]))

// Or 

function reverseMap(arg, fn) {
    return arg.map((_, i, arr) => fn(arr[arr.length - i - 1]))
}

-1

คุณสามารถทำ myArray.reverse () ก่อน

var myArray = ['a', 'b', 'c', 'd', 'e'];
myArray.reverse().map(function (el, index, coll) {
    console.log(el + " ")
});

นั่นจะเป็นวิธีแก้ปัญหาของฉันโดยทั่วไป แต่ในการตั้งค่าฉันใช้การ์ดบนสุดจะถูกวางไว้ด้วยดัชนีสุดท้าย ฉันเดาว่าการจัดทำดัชนีที่ดีขึ้นสามารถแก้ปัญหาได้
Robin Newhouse

16
เช่นเดียวกับหมายเหตุสิ่งนี้จะย้อนกลับอาร์เรย์เดิมซึ่งหมายความว่ามันจะเปลี่ยนลำดับของอาร์เรย์อย่างทำลายล้าง
AdamCooper86

-2

คำถามเก่า แต่สำหรับผู้ดูใหม่นี่เป็นวิธีที่ดีที่สุดในการย้อนกลับอาร์เรย์โดยใช้แผนที่

var myArray = ['a', 'b', 'c', 'd', 'e'];
[...myArray].map(() => myArray.pop());

สิ่งนี้จะปรับเปลี่ยนอาร์เรย์เดิม
TamusJRoyce

บางทีคุณอาจหมายถึง: [...myArray].map((_, _, arr) => arr.pop());?
Madeo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.