क्या जावास्क्रिप्ट के साथ रिवर्स ऑर्डर में एक सरणी पर मानचित्र () का उपयोग करने का एक तरीका है?


94

मैं map()एक जावास्क्रिप्ट सरणी पर फ़ंक्शन का उपयोग करना चाहता हूं , लेकिन मैं इसे रिवर्स ऑर्डर में संचालित करना चाहूंगा।

कारण यह है कि, मैं एक उल्का परियोजना में स्टैक्ड रिएक्ट घटकों का प्रतिपादन कर रहा हूं और नीचे दिए गए बाकी लोड चित्रों को पहले रेंडर करने के लिए शीर्ष-स्तरीय तत्व चाहूंगा।

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

प्रिंट करता है, a b c d eलेकिन मेरी इच्छा है कि एक नक्शा () मुद्रित किया गया थाe d c b a

कोई सुझाव?


2
आप reverseसरणी क्यों नहीं ?
जॉन

2
उन तत्वों को ऑर्डर करने के लिए, जो कि मैं अनुक्रमणिका सूचकांक द्वारा z-index सेट करता हूं। मुझे लगता है कि मैं नकारात्मक होने के लिए z-index सेट कर सकता था।
रॉबिन न्यूहाउस

एक अच्छे विचार की तरह लगता है।
जॉन

साइड नोट पर, क्या आप वास्तव में उस एरे का उपयोग कर रहे हैं जो mapरिटर्न करता है? अन्यथा, आपको विचार करना चाहिए forEach
कैनन

1
आप नक्शे कॉलबैक के भीतर रिवर्स तत्व का उपयोग कर सकते हैं:console.log(coll[coll.length - index - 1] + " ")
le_m

जवाबों:


147

यदि आप मूल सरणी को उल्टा नहीं करना चाहते हैं, तो आप इसकी एक उथली प्रतिलिपि बना सकते हैं, फिर उलट सरणी का नक्शा,

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

मैंने z- इंडेक्स को निर्दिष्ट करने के लिए केवल नकारात्मक इंडेक्स का उपयोग किया, लेकिन जिस तरह से मैंने प्रश्न को तैयार किया वह सबसे सही है।
रॉबिन न्यूहाउस

3
हमें आवश्यकता क्यों है .slice (0)? क्यों नहीं myArray.reverse () के बजाय myArray.slice (0) .reverse ()? मेरी टिप्पणी के लिए उत्तर की तरह लग रहा है: stackoverflow.com/questions/5024085/…
Haradzieniec

हरदज़िएनिएक - यह विवरणों के साथ जाता है कि मूल प्रश्न कैसे तैयार किया गया था, इसमें जेड-इंडेक्स सीएसएस संपत्ति सेट करने के लिए मूल आदेश की आवश्यकता थी, लेकिन रिवर्स में मुद्रित किया गया था।
एडमकोपर 86

slice(0)के रूप में की जरूरत नहीं है reverse()एक नई सरणी लौट सकते हैं और वर्तमान सरणी संशोधित नहीं करता है। @ AdamCooper86 मुझे आशा है कि आप इसे बदलेंगे।
फहद लिहिदेब

4
@FahdLihidheb reverse()मूल सरणी को संशोधित करता है।
फेरस

20

सरणी को बिल्कुल भी परिवर्तित नहीं करना, यहाँ एक लाइनर ओ (n) समाधान है जो मैं लेकर आया हूँ:

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

valयहाँ उपयोग नहीं किया गया है, इसलिए मुझे नहीं लगता कि यह वही है जो ओपी देख रहा था? (यह अभी भी एक अच्छा समाधान है)
पॉल रजवन बर्ग

इसके अतिरिक्त, मानचित्र का तीसरा तर्क () स्वयं सरणी है
नॉट

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();

शॉर्टहैंड (बिना कॉलबैक फ़ंक्शन के) - एरो सिंटैक्स, ईएस 6

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
यह जाने के लिए एक अजीब तरह से लगता है, लेकिन अगर आप तत्व के अलावा इंडेक्स तक पहुंच चाहते हैं, तो रिडर्वट दृष्टिकोण भी अजीब है, वास्तव में कम करना नहीं चाहते हैं, आदि। मेरे मामले में, यह था सबसे साफ समाधान।
रियलहैंडी

1
यदि आपको गिरफ्तार [...] का उपयोग करते हुए नक्शे के अंदर आगे काम करने की आवश्यकता है, तो [...] दूसरी कॉपी या मूल सरणी में हेरफेर करने की आवश्यकता नहीं है। 3rd पैरामीटर के बारे में भूल गए। मैं क्या देख रहा था!
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));

I आप रिवर्स को मैप करने के लिए एरे पास करते हैं और फ़ंक्शन में आप उलटे एरे को वापस करते हैं। नक्शा सीबी में आप केवल 10 (लंबाई) से इंडेक्स काउंटिंग के साथ मानों को नीचे दिए गए सरणी से 1 तक ले जाते हैं


यह कोड क्या कर रहा है, इसके बारे में एक लिखित स्पष्टीकरण सहायक हो सकता है।
प्रो क्यू

0

यहाँ मेरा टाइपस्क्रिप्ट समाधान है जो O (n) दोनों है और दूसरे समाधानों की तुलना में अधिक कुशल है जो दो बार ऐरे के माध्यम से रन रोकते हैं:

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

जावास्क्रिप्ट में:

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 + " ")
});

यह सामान्य रूप से मेरा समाधान होगा, लेकिन सेटअप में मैं शीर्ष कार्ड का उपयोग कर रहा हूं अंतिम सूचकांक के साथ रखा गया है। मुझे लगता है कि बस कुछ बेहतर अनुक्रमण समस्या को हल कर सकता है।
रॉबिन न्यूहाउस

16
नोट के रूप में, यह मूल सरणी को जगह में उलट देगा, जिसका अर्थ है कि यह सरणी के क्रम को विनाशकारी रूप से बदल देगा।
एडमकोपर 86

-2

एक पुराना प्रश्न लेकिन नए दर्शकों के लिए, यह मानचित्र का उपयोग करके सरणी को उलटने का सबसे अच्छा तरीका है

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

यह मूल सरणी को संशोधित करता है
TamusJRoyce

शायद आपका मतलब था [...myArray].map((_, _, arr) => arr.pop());:?
मेडो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.