Lodash का उपयोग करके विखंडू में जावास्क्रिप्ट सरणी विभाजित करें


83

मुझे एक जावास्क्रिप्ट ऐरे को nआकार के टुकड़ों में विभाजित करने की आवश्यकता है ।

जैसे: इस सरणी को देखते हुए

["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"]

और n4 के बराबर है, आउटपुट यह होना चाहिए:

[ ["a1", "a2", "a3", "a4"],
  ["a5", "a6", "a7", "a8"],
  ["a9", "a10", "a11", "a12"],
  ["a13"]
]

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

संपादित करें:

मैंने यह जांचने के लिए एक jsPerf परीक्षण बनाया कि अंडरस्कोर समाधान कितना धीमा है।

जवाबों:


126

लंकेश का हिस्सा देखें : https://lodash.com/docs#chunk

const data = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"];
const chunks = _.chunk(data, 3);
console.log(chunks);
// [
//  ["a1", "a2", "a3"],
//  ["a4", "a5", "a6"],
//  ["a7", "a8", "a9"],
//  ["a10", "a11", "a12"],
//  ["a13"]
// ]
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>


यह मददगार होगा lodash और दोनों पीछे की ओर संगत एपीआई अंडरस्कोर अगर
Jonno_FTW

@ जोनाह यह सच है। पिछला उत्तर अब सबसे अच्छा नहीं है, इसलिए मैंने पाठकों के लिए स्वीकृत उत्तर को अद्यतन किया :)
सीजर कानास

90

अंडरस्कोर आधारित समाधान के लिए यह प्रयास करें:

var data = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"];
var n = 3;
var lists = _.groupBy(data, function(element, index){
  return Math.floor(index/n);
});
lists = _.toArray(lists); //Added this to convert the returned object to an array.
console.log(lists);

श्रृंखला आवरण विधि का उपयोग करके आप नीचे दिए गए दो कथनों को जोड़ सकते हैं:

var data = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"];
var n = 3;
var lists = _.chain(data).groupBy(function(element, index){
  return Math.floor(index/n);
}).toArray()
.value();

1
अजीब तरह से, अंडरस्कोर groupBy एक वस्तु देता है , एक सरणी नहीं। डीलब्रेकर नहीं - आपको मूल रूप से समान कार्यक्षमता मिलती है - लेकिन विषम शब्दार्थ। संपादित करें: ओह, यह चेनबिलिटी बनाए रखने के लिए करता है। फिर भी दिलचस्प है।
जॉर्डन रनिंग

@ केसर कैन्सा: भविष्य के डेवलपर्स के लिए जो उस कोड को पढ़ते हैं, कृपया इसे कस्टम लाइब्रेरी में एक फ़ंक्शन के रूप में रखने पर विचार करें यदि आप इसे बहुत उपयोग करेंगे, या इसे अच्छी तरह से टिप्पणी करेंगे यदि आप :) नहीं होंगे
Briguy37

@ जोर्डन: का एहसास नहीं था। ऑब्जेक्ट को सरणी में बदलने के लिए उत्तर का संपादन किया।
चंदू

मैं चीजों के लिए अंडरस्कोर प्रयोग करने के लिए सब कर रहा हूँ हालांकि यह सबसे अच्छा है (और ओपी एक अंडरस्कोर आधारित समाधान के लिए कहा तो नाहक नहीं है) और कार्यात्मक समाधान के लिए, यह इस समाधान प्रस्तुत किया भूमि के ऊपर का एक टन की तरह लगता है। जैसा कि @ ajax33321 बताते हैं, spliceएक लूप में अभी भी एक तीन-लाइनर है और, मैं अनुमान लगा रहा हूं, अधिक प्रदर्शन करने वाला। यदि आपके सरणियाँ छोटी हैं, तो यह संभवत: कोई फर्क नहीं पड़ता, लेकिन यदि आप सैकड़ों या हजारों वस्तुओं के साथ काम कर रहे हैं, तो इसके प्रदर्शन पर नज़र रखें।
जॉर्डन रनिंग

1
यह अब सबसे अच्छा समाधान नहीं है। कृपया चंक () का उपयोग करें
जोनाह

4

संभवतः सरल अभिव्यक्ति:

const coll = [ "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9" ];
const n = 2;
const chunks = _.range(coll.length / n).map(i => coll.slice(i * n, (i + 1) * n));
console.log(chunks);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>


1
क्या की तुलना में सरल? उत्तर अकेले खड़े होने चाहिए।
नाथन टग्गी

4

अंडरस्कोर _.chunk () को मूल रूप से संस्करण 1.9.0 के रूप में समर्थन करता है ।

const data = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"];
const chunks = _.chunk(data, 4);
console.log(chunks);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore.js"></script>


1

इसे आज़माएं यह बहुत अधिक व्यावहारिक है (उदाहरण के लिए, यदि आप प्रत्येक सरणी में कंटेनर होने के लिए मदों की मात्रा के आधार पर सरणी को विभाजित करना चाहते हैं):

function chunk(arr, start, amount){
    var result = [], 
        i, 
        start = start || 0, 
        amount = amount || 500, 
        len = arr.length;

    do {
        //console.log('appending ', start, '-', start + amount, 'of ', len, '.');
        result.push(arr.slice(start, start+amount));
        start += amount;

    } while (start< len);

    return result;
};

और आपके मामले में उपयोग:

var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],
    chunked = chunk(arr, 0, Math.floor(arr.length/3)); //to get 4 nested arrays

console.log(chunked);

और दूसरा मामला:

var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],
    chunked = chunk(arr, 0, 3); // to get 6 nested arrays each containing maximum of 3 items

console.log(chunked);

यह startपैरामीटर वास्तव में व्यावहारिक नहीं है। आप आमतौर पर इसे पारित नहीं करना चाहेंगे; लेकिन आपको हमेशा चंक आकार निर्दिष्ट करने की आवश्यकता होती है। बेहतर उन दो मापदंडों को स्वैप करें।
बर्गी

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