জাভাস্ক্রিপ্ট সহ একটি দীর্ঘ অ্যারে কীভাবে ছোট অ্যারেগুলিতে বিভক্ত করা যায়


100

আমার ই-মেইলের একটি অ্যারে রয়েছে (এটি কেবলমাত্র 1 ইমেল বা 100 টি ইমেল হতে পারে), এবং আমার একটি এজাক্স অনুরোধের মাধ্যমে অ্যারে প্রেরণ করতে হবে (যা আমি জানি কীভাবে করতে পারি) তবে আমি কেবল একটি অ্যারে প্রেরণ করতে পারি এতে 10 বা তার চেয়ে কম ই-মেইল রয়েছে। সুতরাং যদি 20 টি ইমেলগুলির মূল অ্যারে থাকে তবে আমি সেগুলি প্রতি 10 টির 2 টি অ্যারে বিভক্ত করতে হবে। বা যদি আসল অ্যারেতে 15 টি ইমেল থাকে তবে 10 এর 1 টি অ্যারে এবং 5 এর আরে অ্যারে আমি jQuery ব্যবহার করছি, এটি করার সর্বোত্তম উপায়টি কী হবে?

উত্তর:


195

Jquery ব্যবহার করবেন না ... সরল জাভাস্ক্রিপ্ট ব্যবহার করুন

var a = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];

var b = a.splice(0,10);

//a is now [11,12,13,14,15];
//b is now [1,2,3,4,5,6,7,8,9,10];

আপনার পছন্দসই আচরণটি পেতে আপনি এটি লুপ করতে পারেন।

var a = YOUR_ARRAY;
while(a.length) {
    console.log(a.splice(0,10));
}

এটি আপনাকে একবারে 10 টি উপাদান দেবে ... আপনি যদি 15 টি উপাদান বলে থাকেন তবে আপনি নিজের পছন্দ অনুযায়ী 11-10 পাবেন, 11-15।


9
লক্ষ্য করুন YOUR_ARRAY পাশাপাশি ধ্বংস করা হবে (অ্যারে বস্তু ...)
ক্লডিও

হ্যাঁ, আমি কেবল এটাই বলছিলাম কারণ একটি অ বর্ণনামূলক, এবং আমি ইতিমধ্যে একটি ব্যবহার করে উদাহরণটি লিখেছিলাম ... এটি একটি সম্পূর্ণ অপ্রয়োজনীয় কোড লাইন ... যদিও, এটি আমাকে ভাবতে বাধ্য করে ... যদি এই প্যাটার্নটি ব্যবহার করে, আপনাকে
মূলরূপে

@ জুনভর আইডি কে যদি 2018-এ 1-লাইনার কাজ করে (তবে আমি এটি নিয়ে গুরুতরভাবে সন্দেহ করি) তবে এটি আজ খারাপভাবে ব্যর্থ। আপনার কখনই কোনও অ্যারেটি পুনঃব্যবস্থার পরিবর্তিত হওয়া উচিত নয় (যেমন উপাদানগুলি সরিয়ে ফেলুন), এটি সূচকটি ছুঁড়ে দেয়, অর্থাত প্রতিটি অপসারণের পরে এটি সরানো উপাদানগুলির সংখ্যার সাথে পুনরায় সমন্বয় করা উচিত, সুতরাং এটি "এগিয়ে যায়" এবং এটি গ্রাস করে না পুরোপুরি অ্যারে। এটি ব্যবহার করে দেখুন
ড্রইউ রেজি


38

অ্যারের উপরে কেবল লুপ করুন, এটি সম্পূর্ণ না হয়ে যাওয়া পর্যন্ত স্প্লিক করে।



var a = ['a','b','c','d','e','f','g']
  , chunk

while (a.length > 0) {

  chunk = a.splice(0,3)

  console.log(chunk)

}

আউটপুট


[ 'a', 'b', 'c' ]
[ 'd', 'e', 'f' ]
[ 'g' ]



13

ধরে নিই যে আপনি আসল অ্যারেটি নষ্ট করতে চান না, আপনি লম্বা অ্যারেটিকে ছোট অ্যারেগুলিতে ভাঙ্গতে এই জাতীয় কোড ব্যবহার করতে পারেন যা আপনি এরপরে পুনরাবৃত্তি করতে পারেন:

var longArray = [];   // assume this has 100 or more email addresses in it
var shortArrays = [], i, len;

for (i = 0, len = longArray.length; i < len; i += 10) {
    shortArrays.push(longArray.slice(i, i + 10));
}

// now you can iterate over shortArrays which is an 
// array of arrays where each array has 10 or fewer 
// of the original email addresses in it

for (i = 0, len = shortArrays.length; i < len; i++) {
    // shortArrays[i] is an array of email addresss of 10 or less
}

6

অন্য বাস্তবায়ন:

const arr = ["H", "o", "w", " ", "t", "o", " ", "s", "p", "l", "i", "t", " ", "a", " ", "l", "o", "n", "g", " ", "a", "r", "r", "a", "y", " ", "i", "n", "t", "o", " ", "s", "m", "a", "l", "l", "e", "r", " ", "a", "r", "r", "a", "y", "s", ",", " ", "w", "i", "t", "h", " ", "J", "a", "v", "a", "S", "c", "r", "i", "p", "t"];

const size = 3; 
const res = arr.reduce((acc, curr, i) => {
  if ( !(i % size)  ) {    // if index is 0 or can be divided by the `size`...
    acc.push(arr.slice(i, i + size));   // ..push a chunk of the original array to the accumulator
  }
  return acc;
}, []);

// => [["H", "o", "w"], [" ", "t", "o"], [" ", "s", "p"], ["l", "i", "t"], [" ", "a", " "], ["l", "o", "n"], ["g", " ", "a"], ["r", "r", "a"], ["y", " ", "i"], ["n", "t", "o"], [" ", "s", "m"], ["a", "l", "l"], ["e", "r", " "], ["a", "r", "r"], ["a", "y", "s"], [",", " ", "w"], ["i", "t", "h"], [" ", "J", "a"], ["v", "a", "S"], ["c", "r", "i"], ["p", "t"]]

এনবি - এটি মূল অ্যারেটি পরিবর্তন করে না।

অথবা, যদি আপনি কোনও কার্যকরী পছন্দ করেন তবে ১০০% পরিবর্তনযোগ্য (যদিও উপরের মতো করার মতো জায়গায় পরিবর্তনের ক্ষেত্রে আসলে খারাপ কিছু নেই) এবং স্ব-অন্তর্ভুক্ত পদ্ধতি:

function splitBy(size, list) {
  return list.reduce((acc, curr, i, self) => {
    if ( !(i % size)  ) {  
      return [
          ...acc,
          self.slice(i, i + size),
        ];
    }
    return acc;
  }, []);
}

5

@ জ্যুরের উত্তরের পরিপূরক হিসাবে এবং যদি আপনি এখনও মূল অ্যারে রাখতে চান:

var originalArray = [1,2,3,4,5,6,7,8];

var splitArray = function (arr, size) {

  var arr2 = arr.slice(0),
      arrays = [];

  while (arr2.length > 0) {
      arrays.push(arr2.splice(0, size));
  }

  return arrays;
}

splitArray(originalArray, 2);
// originalArray is still = [1,2,3,4,5,6,7,8];

5

অ্যারে.রেডস বড় অ্যারেগুলির জন্য অযোগ্য হতে পারে, বিশেষত মোড অপারেটরের সাথে। আমি মনে করি একটি ক্লিনার (এবং সম্ভবত পড়া সহজতর) কার্যকরী সমাধানটি হ'ল:

const chunkArray = (arr, size) =>
  arr.length > size
    ? [arr.slice(0, size), ...chunkArray(arr.slice(size), size)]
    : [arr];

3

অন্য পদ্ধতি:

var longArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var size = 2;

var newArray = new Array(Math.ceil(longArray.length / size)).fill("")
    .map(function() { return this.splice(0, size) }, longArray.slice());

// newArray = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]];

এটি আসল অ্যারেটিকে একটি অনুলিপি হিসাবে প্রভাবিত করে না, স্লাইস ব্যবহার করে তৈরি করা হয়েছে, মানচিত্রের 'এই' যুক্তিতে প্রেরণ করা হবে।


3

আমি আমার সমাধানটিও ভাগ করে নিতে চাই। এটি কিছুটা বেশি ভার্বোস তবে এটি কাজ করে।

var data = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];

var chunksize = 4;


var chunks = [];

data.forEach((item)=>{
  if(!chunks.length || chunks[chunks.length-1].length == chunksize)
  chunks.push([]);

  chunks[chunks.length-1].push(item);
});

console.log(chunks);

আউটপুট (ফর্ম্যাট):

[ [ 1,  2,  3,  4],
  [ 5,  6,  7,  8],
  [ 9, 10, 11, 12],
  [13, 14, 15    ] ]

2

আরেআরেডুস ব্যবহার করে আরেকটি বাস্তবায়ন (আমি মনে করি এটি কেবলমাত্র নিখোঁজ!):

const splitArray = (arr, size) =>
{
    if (size === 0) {
        return [];
    }

    return arr.reduce((split, element, index) => {
        index % size === 0 ? split.push([element]) : split[Math.floor(index / size)].push(element);
        return split;
    }, []);
};

উপরে যতগুলি সমাধান, এটির অ-ধ্বংসাত্মক। আকার 0 হলে একটি খালি অ্যারে ফিরে আসা কেবল একটি কনভেনশন। যদি ifব্লকটি বাদ দেওয়া হয় তবে আপনি একটি ত্রুটি পান যা আপনি যা চান তা হতে পারে।


1

আপনি এই কোডটি একবার দেখে নিতে পারেন। সহজ এবং কার্যকর।

function chunkArrayInGroups(array, unit) {
var results = [],
length = Math.ceil(array.length / unit);

for (var i = 0; i < length; i++) {
    results.push(array.slice(i * unit, (i + 1) * unit));
}
 return results;
}

chunkArrayInGroups(["a", "b", "c", "d"], 2);

1

এখানে একটি সাধারণ একটি লাইনার আছে

var segment = (arr, n) => arr.reduce((r,e,i) => i%n ? (r[r.length-1].push(e), r)
                                                    : (r.push([e]), r), []),
        arr = Array.from({length: 31}).map((_,i) => i+1);
console.log(segment(arr,7));



0

আপনি যদি এমন কোনও পদ্ধতি চান যা বিদ্যমান অ্যারেটি সংশোধন করে না তবে এটি ব্যবহার করে দেখুন:

let oldArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
let newArray = [];
let size = 3; // Size of chunks you are after
let j = 0; // This helps us keep track of the child arrays

for (var i = 0; i < oldArray.length; i++) {
  if (i % size === 0) {
    j++
  }
  if(!newArray[j]) newArray[j] = [];
  newArray[j].push(oldArray[i])
}

0
function chunkArrayInGroups(arr, size) {
    var newArr=[];

    for (var i=0; arr.length>size; i++){
    newArr.push(arr.splice(0,size));
    }
    newArr.push(arr.slice(0));
    return newArr;

}

chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6], 3);

করতে ভুলবেন না: newArr = [] একটি স্থানীয় পরিবর্তনশীল
zgthompson

কেবলমাত্র কোডের উত্তরগুলি নিম্নমানের হওয়ার জন্য পতাকাঙ্কিত হয় এবং তারপরে মুছে ফেলা হয়। এটি কীভাবে আসল সমস্যাটি সমাধান করে তার আশেপাশে কিছু ভাষ্য সরবরাহ করতে পারেন?
গ্রাহাম

যদি খণ্ডের আকারটি ইনপুট অ্যারে আকারের চেয়ে কম হয় তবে এটি কাজ করে না।
r3wt

0
function chunkArrayInGroups(arr, size) {
    var newArr=[];

    for (var i=0; i < arr.length; i+= size){
    newArr.push(arr.slice(i,i+size));
    }
    return newArr;

}

chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6], 3);

4
স্ট্যাকওভারফ্লোতে স্বাগতম। আপনার উত্তরটি কিছু ব্যাখ্যা যুক্ত করে উন্নত হবে।
সাইমন.এসএ

0

একটি ফাংশন হিসাবে

var arrayChunk = function (array, chunkSize) {
            var arrayOfArrays = [];

            if (array.length <= chunkSize) {
                arrayOfArrays.push(array);
            } else {
                for (var i=0; i<array.length; i+=chunkSize) {
                    arrayOfArrays.push(array.slice(i,i+chunkSize));
                }
            }
            return arrayOfArrays;
        }

ব্যবহার করা

arrayChunk(originalArray, 10) //10 being the chunk size.

0

পুনরাবৃত্তি ব্যবহার করে

let myArr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16];
let size = 4; //Math.sqrt(myArr.length); --> For a n x n matrix
let tempArr = [];
function createMatrix(arr, i) {
    if (arr.length !== 0) {
      if(i % size == 0) {
        tempArr.push(arr.splice(0,size))
      } 
      createMatrix(arr, i - 1)
    }
}
createMatrix(myArr, myArr.length);
console.log(tempArr);

দ্রষ্টব্য: বিদ্যমান অ্যারে অর্থাৎ আমারআর সংশোধিত হবে।


0

প্রোটোটাইপ ব্যবহার করে আমরা সরাসরি অ্যারে শ্রেণিতে সেট করতে পারি

Array.prototype.chunk = function(n) {
  if (!this.length) {
    return [];
  }
  return [this.slice(0, n)].concat(this.slice(n).chunk(n));
};
console.log([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15].chunk(5));


0
const originalArr = [1,2,3,4,5,6,7,8,9,10,11];
const splittedArray = [];
  while (originalArr.length > 0) {
    splittedArray.push(originalArr.splice(0,range));  
  }

পরিসীমা 3 জন্য আউটপুট

splittedArray === [[1,2,3][4,5,6][7,8,9][10,11]]

পরিসীমা 4 জন্য আউটপুট

splittedArray === [[1,2,3,4][5,6,7,8][9,10,11]]

আপনি কি কিছু বিবরণ যোগ করতে পারেন?
অহং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.