একই উপাদান একাধিকবার পুনরাবৃত্তি সহ একটি অ্যারে তৈরি করুন


323

পাইথনে, যেখানে [2]একটি তালিকা রয়েছে, নিম্নলিখিত কোডগুলি এই আউটপুট দেয়:

[2] * 5 # Outputs: [2,2,2,2,2]

জাভাস্ক্রিপ্টে একটি অ্যারের সাথে এটি করার সহজ উপায় কি আছে?

এটি করার জন্য আমি নীচের ফাংশনটি লিখেছি, তবে এর চেয়ে আরও ছোট বা আরও কিছু আছে?

var repeatelem = function(elem, n){
    // returns an array with element elem repeated n times.
    var arr = [];

    for (var i = 0; i <= n; i++) {
        arr = arr.concat(elem);
    };

    return arr;
};


সম্ভাব্য প্রতিলিপির: stackoverflow.com/questions/1877475/repeat-character-n-times
Benkinass

উত্তর:


52

আপনি এটি এর মতো করতে পারেন:

function fillArray(value, len) {
  if (len == 0) return [];
  var a = [value];
  while (a.length * 2 <= len) a = a.concat(a);
  if (a.length < len) a = a.concat(a.slice(0, len - a.length));
  return a;
}

এটি প্রতিটি পুনরাবৃত্তিতে অ্যারের দ্বিগুণ করে, তাই এটি কয়েকটি পুনরাবৃত্তির সাহায্যে সত্যই বড় অ্যারে তৈরি করতে পারে।


দ্রষ্টব্য: আপনি এর pushপরিবর্তে ব্যবহার করে আপনার ফাংশনটিও অনেক উন্নত করতে পারেন concat, যেমন concatপ্রতিটি পুনরাবৃত্তি একটি নতুন অ্যারে তৈরি করবে। এটি পছন্দ করুন (আপনি কীভাবে অ্যারে দিয়ে কাজ করতে পারবেন তার উদাহরণ হিসাবে দেখানো হয়েছে):

function fillArray(value, len) {
  var arr = [];
  for (var i = 0; i < len; i++) {
    arr.push(value);
  }
  return arr;
}

11
সামনে আরও সমস্ত এন্ট্রি বরাদ্দ করা আরও দক্ষ, এর সাথে arr = new Array(len);লুপের সূচী দ্বারা তাদেরকে অর্পণ করুন, অর্থাৎ arr[i] = value;। এই ভাবে আপনি অ্যারে বাড়ার সাথে সাথে পুনরায় মূল্যায়ন না করে কেবল ও (এন) প্রদান করেন। সাধারণভাবে, সম্ভব হলে সংযোজন করে বাড়ন্ত অ্যারে এড়ানো ভাল। যদি আপনি চূড়ান্ত আকার জানেন, এটি ব্যবহার করুন।
টম কার্জেস

26
Array.from({length:5}).map(x => 2)
noobninja

1
@ নুব্নিনজা: দুর্দান্ত সমাধান; আপনার উত্তর হিসাবে এটি পুনরায় প্রবেশ করা উচিত যাতে এটি উত্সাহ দেওয়া যায়।
jsalvata

692

ES6 এ অ্যারে ফিল () পদ্ধতি ব্যবহার করে

Array(5).fill(2)
//=> [2, 2, 2, 2, 2]

3
ইন্টারনেট এক্সপ্লোরার এবং অপেরা এখনও এটি সমর্থন করে না।
ডেনিসকলোডিন

4
নোড.জেএস <= 3 এটি সমর্থন করে না।
জুনে লি

1
@ ডেনিসকলোডিন কারেন্ট অপেরা করেন। এবং এজ খুব। দেখুন compat-টেবিল
জানুস Troelsen

4
@ মিশেল আপনি এটি দিয়ে এটি করতে পারেন Array(5).fill([1,2,3]).flat()। নোট করুন যে ফ্ল্যাট () এখনও খুব পরীক্ষামূলক এবং ব্রাউজার সমর্থনটি দুর্বল।
নিকো রুটসালাইনেন

3
নোট করুন যে আর্গুমেন্টটি fillএকবার মূল্যায়ন করা হয়, সুতরাং অ্যারেতে Array(9).fill(someMutable)নয়টি রেফারেন্স তৈরি করে someMutable(একজনকে মিউটেট করে 'সেগুলি সমস্ত')।
কার্ল স্মিথ

146
>>> Array.apply(null, Array(10)).map(function(){return 5})
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
>>> //Or in ES6
>>> [...Array(10)].map((_, i) => 5)
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5]

6
নির্বোধ প্রশ্ন, তবে নতুন অ্যারে (10)। ম্যাপটি কেন কাজ করে না?
ব্লাজকোভিচz


5
ES6 এর সাহায্যে এটিকে Array(...Array(10)).map(() => 5)স্প্রেড অপারেটরের সাথে বা এটিতেও "আপগ্রেড" করা যেতে পারেArray.from(Array(10)).map(() => 5)
ক্রিস্টোফ ভিদাল

4
এমডিএন অনুসারে , আপনি ঠিক এটি পছন্দ করতে পারেন:Array.from({length: 10}, () => 5);
প্লাসব প্রেকো

2
@ ব্লাজকোভিচz অ্যারে (10) lenght = 10কোনও অগণিত সম্পত্তি ছাড়াই একটি অ্যারে তৈরি করে। .mapশুধুমাত্র অসংখ্য গুণাবলী নিয়ে কাজ করে। .applyপদ্ধতি এই অ্যারের নেয় এবং মানচিত্র মধ্যে arguments array(একটি অ্যারের মত বস্তু) প্রেরণ করা Arrayকন্সট্রাকটর ফাংশন। আর্গুমেন্টের অ্যারেটি বিচ্ছিন্ন হতে পারে না তাই নিখোঁজ বৈশিষ্ট্যগুলি সেট undefinedহয়ে যায় এবং প্রচুর পরিমাণে পরিণত হয়। এখন আমরা .mapপছন্দ মতো ব্যবহার করতে পারি
CervEd

91

আপনি চেষ্টা করতে পারেন:

Array(6).join('a').split(''); // returns ['a','a','a','a','a'] (5 times)

আপডেট (01/06/2018) :

এখন আপনার কাছে পুনরাবৃত্তি করা অক্ষরের একটি সেট থাকতে পারে।

new Array(5).fill('a'); // give the same result as above;
// or
Array.from({ length: 5 }).fill('a')

নোট: সম্পর্কে আরো পরীক্ষা করে দেখুন ভরাট (...) এবং থেকে (...) সামঞ্জস্য এবং ব্রাউজার সমর্থনের জন্য।

আপডেট (05/11/2019) :

ব্যবহার না করে fillবা অন্য কোনও উপায় fromযা কোনও দৈর্ঘ্যের স্ট্রিংয়ের জন্য কাজ করে:

Array.apply(null, Array(3)).map(_ => 'abc') // ['abc', 'abc', 'abc']

উপরের উত্তর হিসাবে একই । সম্পূর্ণতার জন্য যুক্ত করা হচ্ছে।


1
খুশী হলাম। সবচেয়ে ছোট এবং সহজ।
জোহান এছাওয়ারিয়া

2
সাধারণ পরিচালনা করার জন্য +1। লজ্জাজনক যে আপনি এর বাইরে খালি স্ট্রিংগুলির একটি অ্যারে তৈরি করতে পারবেন না। খুব স্মার্ট ছাড়াও ...
দ্রুত

1
অ্যারে ()) .জাইন ('এ')। বিভক্ত ('ক') আমাকে খালি স্ট্রিংয়ের অ্যারে দেয়।
বিবেক

17
এটি কেবল 1 টি চর স্ট্রিংয়ের জন্য কাজ করে, সুতরাং এটি প্রশ্নের পুরো উত্তর দেয় না।
আজ_

3
@ অ্যালফোনসো ভার্গারা: জাভাস্ক্রিপ্টে স্ট্রিং একটি আদিম (মান-শব্দার্থক) প্রকার; একই ডেটা উল্লেখ করার জন্য দুটি স্ট্রিং পাওয়ার কোনও উপায় নেই (কারণ স্ট্রিং জাভাস্ক্রিপ্টে রেফারেন্স নয় ; তারা মান) আপনাকে অবজেক্ট এবং তালিকাসমূহের সাথে রেফারেন্স শব্দার্থের জন্য নজর রাখতে হবে, তবে স্ট্রিং সহ নয়।
কুক্সপ্লসোন

36

Array.from({length:5}, i => 1) // [1, 1, 1, 1, 1]

বা ক্রমবর্ধমান মান সহ অ্যারে তৈরি করুন

Array.from({length:5}, (e, i)=>i) // [0, 1, 2, 3, 4]


ভাল,
dyn

Array.from({length:5}, i => 1)=> iহয় undefinedযেহেতু এটি খালি মান উপস্থাপন করে Array.from({length:5}, (e, i)=>i)=> eহল undefinedযেহেতু এটি মান খালি প্রতিনিধিত্ব করে। এটি হওয়া উচিত Array.from({length:5}, v => 1)এবংArray.from({length:5}, (v, i)=>i)
রাফাল এডেন

33

ইন lodash এটা এত খারাপ না:

_.flatten(_.times(5, function () { return [2]; }));
// [2, 2, 2, 2, 2]

সম্পাদনা : আরও ভাল:

_.times(5, _.constant(2));
// [2, 2, 2, 2, 2]

সম্পাদনা : আরও ভাল:

_.fill(Array(5), 2);

3
_.টাইম (দৈর্ঘ্য, _ কনস্ট্যান্ট (মান))
ব্যবহারকারী 1533401

1
দস্তাবেজগুলি থেকে: _.ফিল (অ্যারে (3), 2); যা ES6 থেকে খুব বেশি দূরে নয়
ক্যারেট

15

[c] * n হিসাবে লেখা যেতে পারে:

Array(n+1).join(1).split('').map(function(){return c;})

অনেক দূরে [2] * 5

Array(6).join(1).split('').map(function(){return 2;})

আসলে, অ্যারে (6)? জোইন (2) .স্প্লিট ('') সহজ হবে না? আপনার মানচিত্রের দরকার হবে কেন?
অ্যাঞ্জেলা

4
যা ["2", "2", "2", "2", "2"] এর পরিবর্তে [2, 2, 2, 2, 2] ফিরে আসে।
ব্রুক হং

10

আপনি অ্যারের কার্যকারিতাও এর মতো বাড়িয়ে দিতে পারেন:

Array.prototype.fill = function(val){
    for (var i = 0; i < this.length; i++){
        this[i] = val;
    }
    return this;
};
// used like:
var arry = new Array(5)​.fill(2);
// or
var arry = new Array(5);
arry.fill(2);


console.log(arry);​ //[2, 2, 2, 2, 2] 

আমার মনে রাখা উচিত যে বিল্ট-ইন অবজেক্টগুলির কার্যকারিতা বাড়ানো সমস্যার কারণ হতে পারে যদি আপনি তৃতীয় পক্ষের লাইব্রেরি নিয়ে কাজ করছেন। সর্বদা আপনার সিদ্ধান্তগুলির মধ্যে এটি বিবেচনা করুন।


মনে রাখবেন যে আপনি যদি fillঅ্যারের প্রতিটি সূচকে কোনও বস্তুটি পাস করেন তবে একই পদার্থকে উল্লেখ করা হবে, সুতরাং একটি পরিবর্তন করে সেগুলি সব পরিবর্তন করবে। এটি কোনও সমস্যা হয়ে উঠলে এটি সমাধান করা খুব কঠিন নয়।
শ্মিদ্দী

অনেক জাভাস্ক্রিপ্ট ব্যবহারকারী দেশীয় ফাংশনগুলি প্রোটোটাইপ না করার প্রয়োজনীয়তা সম্পর্কে কেন অজানা তা আমি পাই না।
ব্রুও

2
ES6 এ একটি পূরণ পদ্ধতি যুক্ত করা হয়েছে। সুতরাং আমি প্রোটোটাইপে আপনার নিজের জিনিসগুলি যুক্ত করার পরামর্শ দেব না, আপনি দ্রুত এবং আরও সক্ষম সংস্করণটি ওভাররাইট করতে যাচ্ছেন।
জানুস ট্রয়লসেন

1
@ জানুস ট্রেলসন জাভাস্ক্রিপ্ট বা তৃতীয় পক্ষের লাইব্রেরিগুলিকে ওভাররাইট এড়ানোর জন্য আপনি এটি ঘোষণার আগে পরীক্ষা করতে পারেন। if (!Array.prototype.fill) { }
অলিভার

1
@ জ্যানুস ট্রেলসন "রিয়েল পলিফিল" বলতে আপনার অর্থ কী? আমি একটি পলিফেল ব্যবহার করেছি। আমি বলতে চাইছি: বৈশিষ্ট্য সনাক্তকরণ এবং এটি না হলে বাস্তবায়ন পরীক্ষা করুন
অলিভার


5

আপনি যদি অ্যারে কয়েকবার পুনরাবৃত্তি করতে পারেন :

var arrayA = ['a','b','c'];
var repeats = 3;
var arrayB = Array.apply(null, {length: repeats * arrayA.length})
        .map(function(e,i){return arrayA[i % arrayA.length]});
// result: arrayB = ['a','b','c','a','b','c','a','b','c']

এই উত্তর দ্বারা অনুপ্রাণিত


es6, আপনি কি করতে পারেন "ABC" .repeat (3)
জানুস Troelsen

4

এর চেয়ে সহজ উপায় নেই। আপনাকে একটি লুপ তৈরি করতে হবে এবং উপাদানগুলিকে অ্যারেতে ঠেলাতে হবে।


ধন্যবাদ! আমি গ্রহণের আগে দক্ষতার দিক থেকে আরও pushভাল বা concatভাল?
কৌতূহলী 2

কনক্যাটকে দুটি অ্যারে পরিদর্শন করা দরকার, পুশ মাত্র একটি অন্য উপাদান যুক্ত করেছে, তাই আমি পুশ সাধারণভাবে আরও দক্ষ হওয়ার প্রত্যাশা করব, তবে মূল ডেটাটির জন্য আমি মনে করি গুফার উত্তর এটি নখ করেছে।
ডায়োডিয়াস - জেমস ম্যাকফার্লেন

লুপের দরকার নেই, আমার উত্তর দেখুন।
জানুস ট্রয়লসন

@ জ্যানুস ট্রেলসন, আপনি এই ক্রিয়াটি করার জন্য একটি দক্ষ উপায় না চাইলে লুপ করার দরকার নেই। আপনার খুঁজে পেতে পারে এমন ধীর প্রতিবন্ধকতার একটি। () থেকে [] চাপুন দ্রুততম।
ক্রিলিথ

4

এই ফাংশনটি ব্যবহার করুন:

function repeatElement(element, count) {
    return Array(count).fill(element)
}
>>> repeatElement('#', 5).join('')
"#####"

বা আরও কমপ্যাক্ট সংস্করণের জন্য:

const repeatElement = (element, count) =>
    Array(count).fill(element)
>>> repeatElement('#', 5).join('')
"#####"

অথবা কারি-সক্ষম সংস্করণের জন্য:

const repeatElement = element => count =>
    Array(count).fill(element)
>>> repeatElement('#')(5).join('')
"#####"

আপনি একটি তালিকা সহ এই ফাংশনটি ব্যবহার করতে পারেন:

const repeatElement = (element, count) =>
    Array(count).fill(element)

>>> ['a', 'b', ...repeatElement('c', 5)]
['a', 'b', 'c', 'c', 'c', 'c', 'c']

4

আপনার যদি অ্যারে পুনরাবৃত্তি করতে হয় তবে নিম্নলিখিতটি ব্যবহার করুন।

Array.from({ length: 3 }).fill(['a','b','c']).flat()

ফিরে আসবে

Array(9) [ "a", "b", "c", "a", "b", "c", "a", "b", "c" ]

একটি দুর্দান্ত অ্যারে ব্যবহার করে দুর্দান্ত অনলাইনার, আমার যা প্রয়োজন।
জিনেরিক


1

এই ফাংশনটি (দৈর্ঘ্য) উপাদানগুলির একটি অ্যারে তৈরি করে যেখানে প্রতিটি উপাদান সমান (মান) যতক্ষণ না (মান) একটি পূর্ণসংখ্যার পূর্ণসংখ্যা বা স্ট্রিং হয়। যে কোনও দশমিক সংখ্যা কেটে যাবে। আপনি দশমিক সংখ্যার চাও, তাহলে প্রতিস্থাপন "parseInt ( " দিয়ে " parseFloat ( "

function fillArray(length, intValue) {
     var vals = (new Array(length + 1)).join(intValue + '|').split('|').slice(0,length);
     for(var i = 0; i < length; i += 1) {
         vals[i] = parseInt(vals[i]);
     }
     return vals;
}

উদাহরণ:

fillArray(5, 7) // returns [7,7,7,7,7]
fillArray(5, 7.5) // returns [7,7,7,7,7]
fillArray(5, 200) // returns [200,200,200,200,200]

1

আমি যখন অ্যারে ব্যবহার করি তখন উল্লিখিত পদ্ধতিগুলির সাথে আমার সমস্যা ছিল

var array = ['foo', 'bar', 'foobar'];
var filled = array.fill(7);

//filled should be ['foo', 'bar', 'foobar', 'foo', 'bar', 'foobar', 'foo']

এটি পেতে আমি ব্যবহার করছি:

Array.prototype.fill = function(val){
    var l = this.length;
    if(l < val){
        for(var i = val-1-l; i >= 0; i--){
            this[i+l] = this[i % l];
        }
    }
    return this;
};

এটি দুর্দান্ত, তবে সম্ভবত নামকরণ করা উচিত cycle
ড্রেনমি

1

লুপগুলি ব্যবহার না করে 2 ডি অ্যারে করার চেষ্টা করার সময় আমি আজ এটি আবিষ্কার করেছি। বিপরীতে, একটি নতুন অ্যারে যোগদান ঝরঝরে; আমি একটি নতুন অ্যারে ম্যাপিংয়ের চেষ্টা করেছি, যা খালি স্লটগুলিতে মানচিত্র হিসাবে কাজ করে না।

"#".repeat(5).split('').map(x => 0)

"#" চর কোনও বৈধ একক অক্ষর হতে পারে। 5 টি আপনি চান উপাদানগুলির সংখ্যার জন্য একটি ভেরিয়েবল হতে পারে। 7 টি এমন মান হবে যা আপনি আপনার অ্যারেটি পূরণ করতে চান।

নতুন পূরণের পদ্ধতিটি আরও ভাল, এবং আমি এগুলি কোড করে যখন জানতাম না এটির অস্তিত্ব আছে, না আমি জানতাম যে পুনরাবৃত্তি এস 6; আমি এই কৌশলটি শীতল জিনিসগুলি কমাতে ব্যবহারের সাথে ব্যবহার সম্পর্কে একটি ব্লগ পোস্ট লিখতে যাচ্ছি।

http://jburger.us.to/2016/07/14/functionally-create-a-2d-array/




0

আপনি যদি লড্যাশ / আন্ডারস্কোরের মতো কোনও সার্বজনীন বেল্ট ব্যবহার করেন তবে আপনি এটি এটি করতে পারেন :)

let result = _.map(_.times(foo), function() {return bar})

0

ওয়ান-লাইনার হিসাবেও ব্যবহার করা যেতে পারে:

function repeat(arr, len) {
    while (arr.length < len) arr = arr.concat(arr.slice(0, len-arr.length));
    return arr;
}

0

বিবেকের উত্তরের উন্নতি করে , এটি দৈর্ঘ্যের একটি অ্যারেটি তৈরি করতে যে কোনও দৈর্ঘ্যের স্ট্রিংয়ের জন্য কাজ করে:Array(n+1).join('[string to be repeated][separator]').split('[separator]').slice(0, n)


-1

আমার একটি অ্যারে পুনরায় / লুপ করার জন্য একটি উপায় প্রয়োজন (এন আইটেম সহ) এম টাইম।

উদাহরণস্বরূপ, এক সপ্তাহ / মাসে একটি তালিকা (ব্যক্তির) বিতরণ করা। ধরা যাক আমার 3 টি নাম রয়েছে এবং আমি তাদের এক সপ্তাহের মধ্যে পুনরাবৃত্তি করতে চাই:

fillArray(["Adam", "Blair", "Curtis"], 7); // returns ["Adam", "Blair", "Curtis", "Adam", "Blair", "Curtis", "Adam"]

function fillArray(pattern, count) {
    let result = [];
    if (["number", "string"].includes(typeof pattern)) {
        result = new Array(5);
        result.fill(pattern);
    }
    else if (pattern instanceof Array) {
        for (let i = 0; i < count; i++) {
            result = result.concat(pattern);
        }
        result = result.slice(0, count);
    }
    return result;
}

fillArray("a", 5);        // ["a", "a", "a", "a", "a"]
fillArray(1, 5);          // [1, 1, 1, 1, 1]
fillArray(["a", "b"], 5); // ["a", "b", "a", "b", "a"]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.