<কিছু >> বার করুন (ঘোষণামূলক সিনট্যাক্স)


97

জাভাস্ক্রিপ্টে সহজেই এমন কিছু লেখার কোনও উপায় আছে:

[1,2,3].times do {
  something();
}

কোনও লাইব্রেরি যা সম্ভবত কিছু অনুরূপ সিনট্যাক্স সমর্থন করতে পারে?

আপডেট: স্পষ্ট করতে - আমি something()প্রতিটি অ্যারে উপাদান পুনরাবৃত্তির জন্য যথাক্রমে 1,2 এবং 3 বার কল করতে চাই


4
আমি বলব জেএসে এর মতো কোনও বৈশিষ্ট্য নেই, এবং এটি শীর্ষস্থানীয় 5 অনুপস্থিত বৈশিষ্ট্য। এটি কোনও কিছুর চেয়েও বেশি সফ্টওয়্যার পরীক্ষার জন্য খুব দরকারী।
আলেকজান্ডার মিলস

উত্তর:


48

এই উত্তরটি Array.forEachকোনও গ্রন্থাগার ছাড়াই, কেবল নেটিভ ভ্যানিলা ভিত্তিক ।

মূলত something()3 বার কল করতে , ব্যবহার করুন:

[1,2,3].forEach(function(i) {
  something();
});

নিম্নলিখিত ফাংশন বিবেচনা:

function something(){ console.log('something') }

আউটপাউট হবে

something
something
something

এই প্রশ্নগুলি সম্পূর্ণ করার জন্য, এখানে something()যথাক্রমে 1, 2 এবং 3 বার কল করার একটি উপায় রয়েছে :

এটি 2017, আপনি ES6 ব্যবহার করতে পারেন:

[1,2,3].forEach(i => Array(i).fill(i).forEach(_ => {
  something()
}))

বা ভাল পুরাতন ES5 এ:

[1,2,3].forEach(function(i) {
  Array(i).fill(i).forEach(function() {
    something()
  })
}))

উভয় ক্ষেত্রেই আউটপুট হবে

আউটপাউট হবে

something

something
something

something
something
something

(একবার, তারপর দু'বার, তারপরে 3 বার)


18
এটি ভুল কারণ এটি প্রশ্নের এই অংশটি সন্তুষ্ট করে না: 'আমি চাই কিছু () কে 1,2 এবং 3 বার বলা হোক'। এই কোডটি ব্যবহার করে somethingকেবল 3 বার বলা হয়, এটি 6 বার বলা উচিত।
ইয়ান নিউজন

তারপরে আমার ধারণা এটি সেরা উত্তর হিসাবে নির্বাচিত হয়েছে কারণ এটি একটি ভাল ক্লিনার শুরু হতে পারে।
ভিনিয়েল

4
আপনি প্রকৃত সূচকগুলির জন্য আপনার প্রয়োজনের উপর নির্ভর করেও ব্যবহার করতে পারেন [...Array(i)]বা Array(i).fill()
গুইডো বোম্যান

যদি আপনি কোন আর্গুমেন্ট আগ্রহী নন, তাহলে যদি পাস, ব্যবহার.forEach(something)
kvsm

88

কেবল একটি লুপ ব্যবহার করুন:

var times = 10;
for(var i=0; i < times; i++){
    doSomething();
}

4
ধন্যবাদ! আমি একটি ঘোষণামূলক বাক্য গঠন (যেমন জেসমিন ইত্যাদি) থেকে উপকৃত হতে চাই
ব্রেকপ্রেক

ঠিক আছে, তবে লুপ ঘোষণামূলক বাক্য
আলেকজান্ডার মিলস

73

সম্ভাব্য ES6 বিকল্প।

Array.from(Array(3)).forEach((x, i) => {
  something();
});

এবং, যদি আপনি এটি চান "যথাক্রমে 1,2 এবং 3 বার বলা হবে"।

Array.from(Array(3)).forEach((x, i) => {
  Array.from(Array(i+1)).forEach((x, i2) => {
    console.log(`Something ${ i } ${ i2 }`)
  });
});

হালনাগাদ:

ভর্তি-অ্যারে-অপ-সংজ্ঞায়িত থেকে নেওয়া

এটি প্রাথমিক অ্যারে তৈরির আরও অনুকূলিতকরণের উপায় বলে মনে হয়, @ ফেলিক্স-পূর্বনির্দেশের প্রস্তাবিত দ্বিতীয় প্যারামিটার মানচিত্রের ফাংশনটি ব্যবহার করতেও আমি এটি আপডেট করেছি।

Array.from({ length: 3 }, (x, i) => {
  something();
});

4
আমার ঠিক এই কথাটি বলার অপেক্ষা রাখে যে আপনি যদি খুব শীঘ্রই কিছু স্ক্রিপ্ট করে ফেলেন তবে পারফরম্যান্সটি ভয়াবহ, সুতরাং এটি নিবিড় পুনরাবৃত্তির জন্য বা সম্ভবত উত্পাদনে ব্যবহার করবেন না।
nverba

আপনি যদি ES6 এর জন্য যাচ্ছেন তবে আপনি forEach () এর পরিবর্তে মানচিত্র () ব্যবহার করতে পারেন
অ্যান্ডি ফোর্ড

4
যদি সংক্ষিপ্ততা লক্ষ্য হয় (এবং আসলে, তা না হলেও), এটি কল করার পরিবর্তে ফাংশনটি পাস করুন:Array.from(Array(3)).forEach(something)
কেভিএসএম

4
প্রতিক্রিয়া রেন্ডারিং পাশাপাশি কাজ করে।
জোশ শার্কি

4
Array.from()একটি mapFnalচ্ছিক দ্বিতীয় প্যারামিটার রয়েছে , যা আপনাকে অ্যারের প্রতিটি উপাদানগুলিতে একটি মানচিত্র ফাংশন সম্পাদন করতে দেয়, সুতরাং প্রতিটি জন্য ব্যবহার করার দরকার নেই। আপনি কেবল পারেন:Array.from({length: 3}, () => somthing() )
ফেলিক্স ইভ

18

যেহেতু আপনি অ্যান্ডস্কোর উল্লেখ করেছেন:

ধরে নেওয়া fহল যে ফাংশনটি আপনি কল করতে চান:

_.each([1,2,3], function (n) { _.times(n, f) });

কৌতুক করবে উদাহরণস্বরূপ, এর সাথে f = function (x) { console.log(x); }, আপনি আপনার কনসোলটিতে যাবেন: 0 0 1 0 1 2


আসলে, আমি ভেবেছিলাম আপনি বিচ্ছেদ চান।
জিগোজাদ

4
_(3).times(function(n){return n;});কৌতুক করা উচিত। ডক্সটি এখানে দেখুন।
চিপ

18

সঙ্গে lodash :

_.each([1, 2, 3], (item) => {
   doSomeThing(item);
});

//Or:
_.each([1, 2, 3], doSomeThing);

বা যদি আপনি এন বার কিছু করতে চান :

const N = 10;
_.times(N, () => {
   doSomeThing();
});

//Or shorter:
_.times(N, doSomeThing);

পড়ুন এই লিঙ্কে জন্য lodashইনস্টলেশন


15

একটি অ্যারে তৈরি করুন এবং fillসমস্ত আইটেম undefinedযাতে mapপদ্ধতিতে কাজ করতে পারে:

Array.fill কোনও আইই সমর্থন নেই

// run 5 times:
Array(5).fill().map((item, i)=>{ 
   console.log(i) // print index
})

আপনি যদি উপরেরটিকে আরও "ডিক্লেরেটিভ" করতে চান তবে আমার বর্তমানে মতামত ভিত্তিক সমাধানটি হ'ল:


পুরানো স্কুল (বিপরীত) লুপ ব্যবহার:

// run 5 times:
for( let i=5; i--; )
   console.log(i) 

বা একটি ঘোষণাপত্র হিসাবে "যখন" :


4
মনের টুকরো জন্য আমি একটি uuid ফাংশন চালিয়েছি 50k বার চালিয়েছি তা নিশ্চিত করার জন্য যে এটি কোনও ইউইডকে কখনও নকল করে নি। সুতরাং আমি উপরে লুপটি কেবল কিক্সের জন্য বনামকে প্রোফাইল করেছিলাম, ক্রোম দেব সরঞ্জামগুলি ব্যবহার করে কেবল একটি সাধারণ পৃষ্ঠা লোডের মাঝখানে চলতে দেখি যদি আমি বোবা না হয়ে থাকি তবে আমি মনে করি যে এর। 1.2 বিলিয়ন ডলারকে অ্যারে.ইন্ডেক্সঅফ () ব্যবহার করে 50k ইউউইড উত্পাদন করে তুলনা করেনিউজস্কুল = 1 ম-5561.2 মিমি দ্বিতীয়-5426.8 মিমি | Oldschool = 1st-4966.3ms / 2nd-4929.0ms গল্পটির নৈতিকতা আপনি যদি বিলিয়ন + পরিসরে না থাকেন তবে আপনি কখনও এই 200, 1 কে এমনকি 10k বার কিছু করার জন্য কোনও পার্থক্য লক্ষ্য করতে পারবেন না। অঙ্কিত কেউ আমার মত কৌতূহলী হতে পারে।
ribi2k

এটি সঠিক এবং বহু বছর ধরে এটি পরিচিত। গতি সুবিধার জন্য নয় তবে পুরানো ব্রাউজারগুলির সমর্থনের জন্য বিভিন্ন পদ্ধতির উপস্থাপন করা হয়েছিল।
vsync

4
স্পষ্টতই যে কেউ এই থ্রেডটি পড়ে, জানেন তাদের গতির তুলনা করার জন্য আপনি উদাহরণগুলি উপস্থাপন করেন নি। আমি তাদের সামান্য পরীক্ষা চালানোর জন্য ব্যবহার করার জন্য ঘটলাম এবং আমি বুঝতে পেরেছিলাম যে রাস্তার নিচে থাকা কাউকে আকর্ষণীয় মনে হতে পারে এমন কিছু তথ্য ভাগ করব। আমি সত্যিকার অর্থে সঠিক নই কারণ আমি কেবল কোনও তথ্যের উত্তর দিচ্ছিলাম না কেবল তথ্য প্রদর্শন করা এবং লুপের গতি ঘামতে না দেওয়ার জন্য একটি অনুস্মারক দিচ্ছিলাম যখন আপনি কেবল কয়েকটি কাজ করছেন যা যাইহোক দু'মুহূর্তে শেষ হবে। এটি সত্যই জানা যায়নি কারণ এক বছর আগে একই পরীক্ষা অর্থাত্ একটি 50% ধীর হতে পারে কারণ ব্রাউজারগুলি সব সময় পরিবর্তন করে।
ribi2k

10

আপনি নীচের মত ধ্বংসাত্মক সঙ্গে একই জিনিস করতে পারেন

[...Array(3)].forEach( _ => console.log('do something'));

বা আপনার যদি সূচকের প্রয়োজন হয়

[...Array(3)].forEach(( _, index) => console.log('do something'));

8

যদি আপনি অ্যান্ডস্কোরজগুলি ব্যবহার করতে না পারেন তবে আপনি নিজে এটি প্রয়োগ করতে পারেন। সংখ্যা এবং স্ট্রিং প্রোটোটাইপগুলিতে নতুন পদ্ধতি সংযুক্ত করে আপনি এটি এর মতো করতে পারেন (ES6 তীর ফাংশন ব্যবহার করে):

// With String
"5".times( (i) => console.log("number "+i) );

// With number variable
var five = 5;
five.times( (i) => console.log("number "+i) );

// With number literal (parentheses required)
(5).times( (i) => console.log("number "+i) );

আপনাকে কেবল একটি ফাংশন এক্সপ্রেশন তৈরি করতে হবে (যে কোনও নামেই) এবং যে কোনও সম্পত্তির নাম (প্রোটোটাইপগুলিতে) আপনি এটিকে অ্যাক্সেস করতে চান তা এটাকে দিতে হবে:

var timesFunction = function(callback) {
  if (typeof callback !== "function" ) {
    throw new TypeError("Callback is not a function");
  } else if( isNaN(parseInt(Number(this.valueOf()))) ) {
    throw new TypeError("Object is not a valid number");
  }
  for (var i = 0; i < Number(this.valueOf()); i++) {
    callback(i);
  }
};

String.prototype.times = timesFunction;
Number.prototype.times = timesFunction;

4
প্রোটোটাইপটি প্যাচ করা আমার পক্ষে কতটা খারাপ তা আবার খতিয়ে দেখতে হবে, তবে সাধারণত এটি ঠিক থাকে
আলেকজান্ডার মিলস

2

রামদা নামে একটি চমত্কার গ্রন্থাগার রয়েছে যা অ্যান্ডস্কোর এবং লোদাশের সমান, তবে আরও শক্তিশালী।

const R = require('ramda');

R.call(R.times(() => {
    console.log('do something')
}), 5);

রামদাতে প্রচুর উপকারী কাজ রয়েছে। রামদা ডকুমেন্টেশন দেখুন


আমি এই লাইব্রেরিকে একটি আধুনিক এবং মার্জিত এফপি সমাধান হিসাবে পছন্দ করি।
মোমোকো

1

আপনি আপনার টাস্কের সংখ্যাটি নির্ধারণ করতে অ্যারের দৈর্ঘ্য ব্যবহার করতে পারেন।

var arr = [1,2,3];

for(var i=0; i < arr.length; i++){
    doSomething();
}

বা

 var arr = [1,2,3];

 do
 {


 }
 while (i++ < arr.length);

1

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

অ্যারে.এফ.এচ

উদাহরণ:

function logArrayElements(element, index, array) {  
    console.log("a[" + index + "] = " + element);  
}  
[2, 5, 9].forEach(logArrayElements)

বা jQuery সহ

$.each([52, 97], function(index, value) { 
  alert(index + ': ' + value); 
});

http://api.jquery.com/jQuery.each/


দেখে মনে হচ্ছে forEachএটি কেবল 9 সংস্করণ 9 এ সমর্থিত: developer.mozilla.org/en/
ব্রুনো

1
times = function () {
    var length = arguments.length;
    for (var i = 0; i < length ; i++) {
        for (var j = 0; j < arguments[i]; j++) {
            dosomthing();
        }
    }
}

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

times(3,4);
times(1,2,3,4);
times(1,3,5,7,9);

+1 - এটি পরিবর্তনশীল পরিমাণের পরামিতিগুলির সাথে ফাংশনগুলি কল করতে জাভাস্ক্রিপ্টের স্থানীয় ক্ষমতাটি ব্যবহার করে। কোনও অতিরিক্ত লাইব্রেরির প্রয়োজন নেই। দুর্দান্ত সমাধান
রাস্টি দ্য বয়রবোট


1
var times = [1,2,3];

for(var i = 0; i < times.length;  i++) {
  for(var j = 0; j < times[i];j++) {
     // do something
  }
}

JQuery ব্যবহার করে .each()

$([1,2,3]).each(function(i, val) {
  for(var j = 0; j < val;j++) {
     // do something
  }
});

বা

var x = [1,2,3];

$(x).each(function(i, val) {
  for(var j = 0; j < val;j++) {
     // do something
  }
});

সম্পাদনা

খাঁটি জেএস দিয়ে আপনি নীচের মতো করতে পারেন:

var times = [1,2,3];
times.forEach(function(i) {
   // do something
});

0

কেবল নেস্টেড লুপটি ব্যবহার করুন (সম্ভবত কোনও ফাংশনে আবদ্ধ)

function times( fct, times ) {
  for( var i=0; i<times.length; ++i ) {
    for( var j=0; j<times[i]; ++j ) {
      fct();
    }
  }
}

তারপরে এটিকে কেবল এইভাবে কল করুন:

times( doSomething, [1,2,3] );

0

এই উত্তরগুলি সমস্ত ভাল এবং ভাল এবং আইএমও @ অ্যান্ড্রিয়াস সেরা, তবে জেএস-এর অনেকবার আমরা অসম্পূর্ণভাবে কিছু করতে হবে, সেক্ষেত্রে, অ্যাসিঙ্ক আপনি আবৃত করেছেন:

http://caolan.github.io/async/docs.html#টাইম

const async = require('async');

async.times(5, function(n, next) {
    createUser(n, function(err, user) {
        next(err, user);
    });
}, function(err, users) {
    // we should now have 5 users
});

এই 'সময়' বৈশিষ্ট্যগুলি বেশিরভাগ অ্যাপ্লিকেশন কোডের জন্য খুব কার্যকর নয় তবে এটি পরীক্ষার জন্য কার্যকর হওয়া উচিত।



0

একটি ফাংশন দেওয়া something:

function something() { console.log("did something") }

এবং প্রোটোটাইপে একটি নতুন পদ্ধতি timesযুক্ত হয়েছে Array:

Array.prototype.times = function(f){
  for(v of this) 
    for(var _ of Array(v))
      f();
}

এই কোড:

[1,2,3].times(something)

এটি ফলাফল:

did something
did something
did something
did something
did something
did something

যা আমি মনে করি আপনার আপডেট হওয়া প্রশ্নের উত্তর (5 বছর পরে) তবে আমি ভাবছি যে এই কাজটি অ্যারেতে রাখা কতটা কার্যকর? প্রভাবটি কল করার মতো হবে না [6].times(something), যার ফলস্বরূপ এটি লিখিত হতে পারে:

for(_ of Array(6)) something();

(যদিও _জাঙ্ক ভেরিয়েবল হিসাবে ব্যবহার সম্ভবত ক্লোবার লড্যাশ বা আন্ডারস্কোর ব্যবহার করবে যদি আপনি এটি ব্যবহার করেন)


4
নেটিভ জেএস অবজেক্টে কাস্টম পদ্ধতি যুক্ত করা খারাপ অভ্যাস হিসাবে বিবেচিত হয়।
লাইয়ার এলরম

আপনি কমপক্ষে এর বাইরে ক্লোবার্বিং লোডাশ প্রতিরোধ করতে letহিসাবে ব্যবহার করতে পারেন for (let _ of Array(6)) something()
সিরো সান্তিলি 郝海东 冠状 病 六四 事件



0

ধরে নিই আমরা স্প্রেড অপারেটরের মতো কিছু ES6 সিনট্যাক্স ব্যবহার করতে পারি, আমরা সংগ্রহের সমস্ত সংখ্যার যোগফল হিসাবে বহুবার কিছু করতে চাই।

এই ক্ষেত্রে যদি বারের সমান হয় [1,2,3]তবে মোট বার সংখ্যা 6 হবে, অর্থাৎ 1 + 2 + 3 হবে।

/**
 * @param {number[]} times
 * @param {cb} function
 */
function doTimes(times, cb) {
  // Get the sum of all the times
  const totalTimes = times.reduce((acc, time) => acc + time);
  // Call the callback as many times as the sum
  [...Array(totalTimes)].map(cb);
}

doTimes([1,2,3], () => console.log('something'));
// => Prints 'something' 6 times

এই পোস্টটি সহায়ক হওয়া উচিত যদি অ্যারে তৈরি এবং ছড়িয়ে দেওয়ার পিছনে যুক্তিটি আপাতদৃষ্টিতে প্রকাশ না করে।


0

টাইপস্ক্রিপ্ট বাস্তবায়ন:

আপনারা যারা বাস্তবায়ন করতে চান String.timesএবং Number.timesযেভাবে নিরাপদ টাইপ করা যায় এবং যেভাবে কাজ করে সে সম্পর্কে thisArgএখানে আগ্রহী, আপনি এখানে যান:

declare global {
    interface Number {
        times: (callbackFn: (iteration: number) => void, thisArg?: any) => void;
    }
    interface String {
        times: (callbackFn: (iteration: number) => void, thisArg?: any) => void;
    }
}

Number.prototype.times = function (callbackFn, thisArg) {
    const num = this.valueOf()
    if (typeof callbackFn !== "function" ) {
        throw new TypeError("callbackFn is not a function")
    }
    if (num < 0) {
        throw new RangeError('Must not be negative')
    }
    if (!isFinite(num)) {
        throw new RangeError('Must be Finite')
    }
    if (isNaN(num)) {
        throw new RangeError('Must not be NaN')
    }

    [...Array(num)].forEach((_, i) => callbackFn.bind(thisArg, i + 1)())
    // Other elegant solutions
    // new Array<null>(num).fill(null).forEach(() => {})
    // Array.from({length: num}).forEach(() => {})
}

String.prototype.times = function (callbackFn, thisArg) {
    let num = parseInt(this.valueOf())
    if (typeof callbackFn !== "function" ) {
        throw new TypeError("callbackFn is not a function")
    }
    if (num < 0) {
        throw new RangeError('Must not be negative')
    }
    if (!isFinite(num)) {
        throw new RangeError('Must be Finite')
    }
    // num is NaN if `this` is an empty string 
    if (isNaN(num)) {
        num = 0
    }

    [...Array(num)].forEach((_, i) => callbackFn.bind(thisArg, i + 1)())
    // Other elegant solutions
    // new Array<null>(num).fill(null).forEach(() => {})
    // Array.from({length: num}).forEach(() => {})
}

কিছু উদাহরণ সহ টাইপস্ক্রিপ্ট প্লেগ্রাউন্ডের একটি লিঙ্ক এখানে পাওয়া যাবে

এই পোস্টটি পোস্ট করেছেন সমাধানগুলি কার্যকর করেছেন: আন্দ্রেয়াস বার্গস্ট্রোম , ভিনিল , ওজয় ডুমান , এবং সেরেগপি

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