मानचित्र और कम के बीच मुख्य अंतर


86

मैंने दोनों विधियों का उपयोग किया है लेकिन मैं दोनों विधियों के उपयोग को लेकर काफी उलझन में हूं।

क्या ऐसा कुछ भी है जो mapकर सकता है reduceऔर इसके विपरीत नहीं कर सकता है?

नोट: मुझे पता है कि दोनों विधियों का उपयोग कैसे करें मैं इन पद्धति के बीच मुख्य अंतर के लिए पूछताछ कर रहा हूं और जब हमें उपयोग करने की आवश्यकता होती है।

जवाबों:


236

स्रोत

दोनों mapऔर reduceसरणी और एक समारोह आप को परिभाषित इनपुट के रूप में की है। वे किसी तरह से पूरक हैं: mapकई तत्वों की एक सरणी के लिए एक एकल तत्व वापस नहीं कर सकते हैं, जबकि reduceहमेशा संचायक को आप अंततः बदल देंगे।

map

mapतत्वों का उपयोग करने के लिए, और प्रत्येक तत्व के लिए आप अपने इच्छित तत्व को वापस करते हैं।

उदाहरण के लिए, यदि आपके पास संख्या है और उनके वर्ग प्राप्त करना चाहते हैं, तो आप यह कर सकते हैं:

// A function which calculates the square
const square = x => x * x

// Use `map` to get the square of each number
console.log([1, 2, 3, 4, 5].map(square))

reduce

इनपुट के रूप में एक सरणी का उपयोग करके, आप कॉलबैक फ़ंक्शन (पहला तर्क) के आधार पर एक एकल तत्व (मान लें कि कोई ऑब्जेक्ट, या संख्या, या कोई अन्य सरणी) प्राप्त कर सकते हैं, जो accumulatorऔर current_elementपैरामीटर प्राप्त करता है:

const numbers = [1, 2, 3, 4, 5]

// Calculate the sum
console.log(numbers.reduce(function (acc, current) {
  return acc + current
}, 0)) // < Start with 0

// Calculate the product
console.log(numbers.reduce(function (acc, current) {
  return acc * current
}, 1)) // < Start with 1


जब आप दोनों के साथ एक ही काम कर सकते हैं, तो आपको किसे चुनना चाहिए? कोड कैसे दिखता है, इसकी कल्पना करने की कोशिश करें। दिए गए उदाहरण के लिए, आप उपयोग किए गए वर्गों की गणना कर सकते हैं, जैसे आपने बताया था reduce:

// Using reduce
[1, 2, 3, 4, 5].reduce(function (acc, current) {
    acc.push(current*current);
    return acc;
 }, [])

 // Using map
 [1, 2, 3, 4, 5].map(x => x * x)

अब, इन्हें देखते हुए, जाहिर है कि दूसरा कार्यान्वयन बेहतर है और यह छोटा है। आमतौर पर आप क्लीनर समाधान चुनते हैं, जो इस मामले में है map। बेशक, आप इसे कर सकते हैं reduce, लेकिन संक्षेप में, सोचें कि कौन सा छोटा होगा और आखिरकार यह बेहतर होगा।


2
ठीक है, मैं आपको उदाहरण देख रहा हूं, लेकिन एक ही काम मैं कम कर सकता हूं कि कौन सा अच्छा है और क्यों? नक्शे के साथ मौजूदा सरणी को कम या संशोधित करने के साथ नई सरणी बनाना।
निशांत दीक्षित

@NishantDixit क्या मतलब है कि आप उसी के साथ काम कर सकते हैं reduce? आप ऐसा नहीं कर सकते, यही मैंने उन उदाहरणों में दिखाने की कोशिश की।
Ionică Bizău

मैं नीचे टिप्पणी में विधि को जोड़ रहा हूं जो दिए गए वर्ग की गणना करता है और नई सरणी लौटाता है।
निशांत दीक्षित

console.log([1, 2, 3, 4, 5].reduce(function (acc, current) { acc.push( current = current*current); return acc; }, []))
निशांत दीक्षित

2
उपयोग करने के लिए चुनने पर, इरादा महत्वपूर्ण है। यदि दोनों समान परिणाम प्राप्त कर सकते हैं, और चूंकि प्रदर्शन अंतर नगण्य है, तो उस फ़ंक्शन का उपयोग करें जो आपके इरादे से मेल खाता है जैसे कि "जब आप" मैप "के नीचे उल्लेखित हैं, तो आप एक फ़ंक्शन लिख रहे हैं जो x को f (x) के साथ कुछ नए में बदल देता है। मान X1। जब आप "कम" करते हैं, तो आप कुछ फ़ंक्शन जी (y) लिख रहे हैं जो सरणी y लेता है और सरणी y1 का उत्सर्जन करता है "।
f0rfun

18

आम तौर पर "मैप" का मतलब इनपुट की एक श्रृंखला को आउटपुट की समान लंबाई की श्रृंखला में परिवर्तित करना है, जबकि "कम" का अर्थ है इनपुट की श्रृंखला को कम संख्या में आउटपुट में परिवर्तित करना ।

"मैप-कम" से लोगों को क्या मतलब है आमतौर पर "परिवर्तन, संभवतः समानांतर में, क्रमिक रूप से गठबंधन" का अर्थ है।

जब आप "मैप" करते हैं, तो आप एक फ़ंक्शन लिख रहे होते हैं जो कुछ नए मूल्य में बदल xजाता है । जब आप "कम" करते हैं तो आप कुछ फ़ंक्शन लिख रहे हैं जो सरणी लेता है और सरणी का उत्सर्जन करता है । वे विभिन्न प्रकार के डेटा पर काम करते हैं और विभिन्न परिणाम उत्पन्न करते हैं।f(x)x1g(y)yy1


वास्तव में, दोनों डेटा प्रकार स्वतंत्र हैं, न कि "वे विभिन्न प्रकार के डेटा पर काम करते हैं ..." ठीक है?
JWP

12

मुझे लगता है कि यह तस्वीर आपको उन एचओसी के बीच अंतर के बारे में जवाब देगी यहाँ छवि विवरण दर्ज करें


6

map()समारोह इनपुट सरणी में प्रत्येक तत्व पर एक समारोह गुजर के माध्यम से एक नई सरणी देता है।

यह अलग है reduce()जो एक सरणी और एक फ़ंक्शन को उसी तरह लेता है, लेकिन फ़ंक्शन 2इनपुट लेता है - एक संचायक और एक वर्तमान मूल्य।

तो reduce()इस्तेमाल किया जा सकता है map()अगर आप हमेशा .concatएक फ़ंक्शन से अगले आउटपुट संचायक पर। हालाँकि यह आमतौर पर एक सरणी के आयामों को कम करने के लिए उपयोग किया जाता है इसलिए या तो एक आयामी ले रहा है और एक एकल मान लौटाता है या दो आयामी आयामों को समतल करता है आदि।


5

आइए एक-एक करके इन दोनों को देखें।

नक्शा

नक्शा कॉलबैक लेता है और इसे सरणी के प्रत्येक तत्व के विरुद्ध चलाता है लेकिन जो इसे विशिष्ट बनाता है वह आपके मौजूदा सरणी के आधार पर एक नया सरणी उत्पन्न करता है

var arr = [1, 2, 3];

var mapped = arr.map(function(elem) {
    return elem * 10;
})

console.log(mapped); // it genrate new array

कम करना

एरे ऑब्जेक्ट की विधि को कम करने के लिए एरे को एक एकल मान पर कम करने के लिए उपयोग किया जाता है ।

var arr = [1, 2, 3];

var sum = arr.reduce(function(sum, elem){
    return sum + elem;
})

console.log(sum) // reduce the array to one single value


3

नक्शा, फ़िल्टर और कम करने के बीच के अंतर को समझने के लिए, इसे याद रखें:

  1. सभी तीन विधियां सरणी पर लागू होती हैं इसलिए जब भी आप किसी सरणी पर कोई ऑपरेशन करना चाहते हैं, आप इन विधियों का उपयोग करेंगे।
  2. सभी तीन कार्यात्मक दृष्टिकोणों का पालन करते हैं और इसलिए मूल सरणी समान रहती है । मूल सरणी बदले नहीं जाती है इसके बजाय एक नया सरणी / मान लौटाया जाता है।
  3. Map बराबर के साथ एक नया सरणी देता है। तत्वों के मूल सरणी में हैं। इसलिए, यदि मूल सरणी में 5 तत्व हैं, तो दिए गए सरणी में 5 तत्व भी होंगे। इस पद्धति का उपयोग तब किया जाता है जब हम किसी सरणी के प्रत्येक व्यक्तिगत तत्व पर कुछ बदलाव करना चाहते हैं। आप याद रख सकते हैं कि आउटपुट सरणी में ऐन ऐरे के प्रत्येक तत्व को कुछ नए मूल्य पर मैप किया जा रहा है, इसलिए नाम map उदाहरण के लिए,

var originalArr = [1,2,3,4]
//[1,2,3,4]
var squaredArr = originalArr.map(function(elem){
  return Math.pow(elem,2);
});
//[1,4,9,16]

  1. Filter मूल सरणी की तुलना में तत्वों के बराबर / कम संख्या के साथ एक नया सरणी देता है । यह उन तत्वों को सरणी में लौटाता है जो कुछ स्थिति से गुजर चुके हैं। इस पद्धति का उपयोग तब किया जाता है जब हम मूल सरणी पर एक फ़िल्टर लागू करना चाहते हैं इसलिए नाम filter। उदाहरण के लिए,

var originalArr = [1,2,3,4]
//[1,2,3,4]
var evenArr = originalArr.filter(function(elem){
  return elem%2==0;
})
//[2,4]

  1. Reduceमानचित्र / फ़िल्टर के विपरीत एकल मान लौटाता है। इसलिए, जब भी हम किसी सरणी के सभी तत्वों पर एक ऑपरेशन चलाना चाहते हैं, लेकिन सभी तत्वों का उपयोग करके एक एकल आउटपुट चाहते हैं, तो हम उपयोग करते हैं reduce। आप याद रख सकते हैं कि सरणी का आउटपुट एकल मान से कम हो जाता है इसलिए नाम reduce। उदाहरण के लिए,

var originalArr = [1,2,3,4]
//[1,2,3,4]
var sum = originalArr.reduce(function(total,elem){
  return total+elem;
},0)
//10

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.