জাভাস্ক্রিপ্টে লুপের জন্য - কী মান জোড়া


414

আমি ভাবছিলাম যে foreachজাভাস্ক্রিপ্টে পিএইচপি লুপের মতো কিছু করার উপায় আছে কি না । আমি যে কার্যকারিতাটি সন্ধান করছি তা হ'ল এই পিএইচপি স্নিপেটের মতো:

foreach($data as $key => $value) { }

আমি জেএস for..inলুপটির দিকে চেয়ে ছিলাম তবে এটির নির্দিষ্ট করার কোনও উপায় নেই বলে মনে হচ্ছে as। আমি যদি লুপ ( for(var i = 0; i < data.length; i++) এর জন্য 'সাধারণ' দিয়ে এটি করি তবে কী => মান জোড়াটি ধরার উপায় আছে?

উত্তর:


215

আপনি যদি ES6 স্থানীয়ভাবে বা ব্যাবেল (জেএস সংকলক) এর সাথে ব্যবহার করতে পারেন তবে আপনি নিম্নলিখিতগুলি করতে পারেন:

const test = {a: 1, b: 2, c: 3};

for (const [key, value] of Object.entries(test)) {
  console.log(key, value);
}

যা এই আউটপুট প্রিন্ট করবে:

a 1
b 2
c 3

Object.entries()পদ্ধতি একটি প্রদত্ত বস্তু নিজস্ব গণনীয় সম্পত্তির একটি বিন্যাস দেখায় [key, value]জোড়া একটি যেমন দেওয়া হয়েছিল তেমন একই আদেশ, for...inলুপ (পার্থক্য হচ্ছে যে একটি জন্য-ইন প্রোটোটাইপ চেন লুপ উল্লেখ বৈশিষ্ট্য হিসাবে ভাল)

আশা করি এটা সাহায্য করবে! =)


1
এটি নিখুঁতভাবে কাজ করে, কেবল অবাক হয়ে যায় - তুলনায় "বস্তুর কীটির জন্য এবং তারপরে অবজেক্ট দ্বারা [কী]" মান পাওয়া যায়, কোনটি আরও ভাল পারফরম্যান্স দেয়?
lsheng

1
এই নির্দিষ্ট ক্ষেত্রে আমি Object.entriesকল করার কারণে এটি ধীর করব । যদিও আমি কোনও পরীক্ষা চালাইনি।
ফ্রান্সেসকো ক্যাসুলা

6
এটি হ'ল প্রশ্নের উত্তরের সেরা উত্তর যা লুপের জন্য কী এবং মান উভয়ই দখল করার বিষয়ে জিজ্ঞাসা করেছিল।
সিপাক

4
গ্রহণযোগ্য উত্তরটি আপডেট করা উচিত কারণ এটি আসলে প্রশ্নের উত্তর দেয়, যদিও এটি প্রশ্নের সময় উপস্থিত ছিল না।
মার্ক কোয়ালি

1
আপনি এই প্রশ্নটি যাচাই করতে চাইতে পারেন: stackoverflow.com/questions/47213651/… যা মনে করে যে এই ধরণের একটি সিনট্যাক্সের প্রস্তাব দেওয়া হবে: অবজেক্ট.কিজ (মাইঅবজেক্ট) .Each (কী => {...
উইল59

519
for (var k in target){
    if (target.hasOwnProperty(k)) {
         alert("Key is " + k + ", value is " + target[k]);
    }
}

hasOwnPropertytargetপ্রোটোটাইপ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হওয়ার পরিবর্তে আপনার সত্যিই সেই সম্পত্তি আছে কিনা তা যাচাই করতে ব্যবহৃত হয় । কিছুটা সহজ হবে:

for (var k in target){
    if (typeof target[k] !== 'function') {
         alert("Key is " + k + ", value is" + target[k]);
    }
}

এটা ঠিক চেক যে kএকটি পদ্ধতি নয় (যেমন যদি targetহয় arrayআপনি পদ্ধতি অনেকটা পাবেন সতর্ক, যেমন indexOf, push, pop, ইত্যাদি।)


87
কেবলমাত্র "নিজস্ব" বৈশিষ্ট্যগুলির উপর পুনরাবৃত্তি করার আরেকটি উপায় Object.keysObject.keys(target).forEach(function (key) { target[key]; });
কেটসফোগ

3
targetব্যবহার করে তৈরি করা হলে কাজ করতে যাচ্ছি না Object.create(null), কোড পরিবর্তন করা উচিত target.hasOwnProperty(k)->Object.prototype.hasOwnProperty.call(target,k)
আজ্ডার

প্রশ্ন উদাহরণে প্রদত্ত ভেরিয়েবলগুলি ব্যবহার করবেন না কেন? এখানে কি k, targetএবং property? আমার জন্য, জাভাস্ক্রিপ্টার এই অঞ্চলটিকে
গেডিমিনাস

2
অবজেক্ট.কিজ (টার্গেট) .এফইচ ((কী) => {লক্ষ্য [কী];;);
কৌণিকের

315

কেউ উল্লেখ করেনি Object.keysতাই আমি উল্লেখ করব।

Object.keys(obj).forEach(function (key) {
   // do something with obj[key]
});

3
দ্রষ্টব্য: আইই 8 এবং নীচে দ্বারা সমর্থিত নয়।
এডউইন স্টোলেটার

1
এই মুহুর্তে আপনার একটি ES5 শিম ব্যবহার করা উচিত। আপনি যদি for of ইএস 6
ছাগলছানা

17
এটি লক্ষণীয় যে, "ব্যতিক্রম ছোঁড়া ছাড়া কোনও ফোরইচ () লুপ থামানোর বা ভাঙার কোনও উপায় নেই"
রাউলস

অবজেক্ট.কিজ (আপত্তি) .ফৌচ ((কী) => {});
কৌণিকের

এটি ES6 এ কাজ করে না বা আমি এটি বুঝতে পারি না। ফেলিক্সের নীচে আরও ভাল এবং আরও পঠনযোগ্য উত্তর রয়েছে: ডেটা.ফোর্চ (ফাংশন (মান, সূচক) {কনসোল.লগ (সূচক); // 0, 1, 2 ...});
gtamborero

115

জন্য ... আপনার জন্য কাজ করবে।

for( var key in obj ) {
  var value = obj[key];
}

আধুনিক জাভাস্ক্রিপ্টে আপনি এটিও করতে পারেন:

for ( const [key,value] of Object.entries( obj ) ) {

}

64
var obj = {...};
for (var key in obj) {
    var value = obj[key];

}

পিএইচপি সিনট্যাক্সটি কেবল চিনি।


এটি উত্তরাধিকারসূত্রে প্রাপ্ত সমস্ত সম্পত্তিগুলিতে পুনরাবৃত্তি করবে। এটি এড়াতে। .সাহ্নে প্রপার্টি () ব্যবহার করুন।
LSerni

24

আমি ধরে নিলাম যে আপনি জানেন যে iএটিই কী এবং আপনি এর মাধ্যমে মানটি পেতে পারেন data[i](এবং কেবল এটির জন্য একটি শর্টকাট চাই)।

ECMAScript5 অ্যারেগুলির জন্য forEach [MDN] প্রবর্তন করেছে (মনে হচ্ছে আপনার অ্যারে রয়েছে):

data.forEach(function(value, index) {

});

এমডিএন ডকুমেন্টেশন ব্রাউজারগুলিকে সমর্থন করে না এমন জন্য একটি শিম সরবরাহ করে।

অবশ্যই এটি বস্তুর জন্য কাজ করে না, তবে আপনি তাদের জন্য একটি অনুরূপ ফাংশন তৈরি করতে পারেন:

function forEach(object, callback) {
    for(var prop in object) {
        if(object.hasOwnProperty(prop)) {
            callback(prop, object[prop]);
        }
    }
}

যেহেতু আপনি প্রশ্নটি ট্যাগ করেছেন , jQuery $.each [ডক্স] সরবরাহ করে যা অ্যারে এবং অবজেক্ট স্ট্রাকচার উভয়ের উপরে লুপ করে।


এটা অ্যারে forEach, আপত্তি না forEach

2
তাই? স্পষ্টতই ওপি একটি অ্যারের উপরে লুপ করছে।
ফেলিক্স ক্লিং

এছাড়াও মজিলা (ফায়ারফক্স, স্পাইডারমনকি-সি, রাইনো এবং সি) এর একটি মানহীন এক্সটেনশন রয়েছে যা for eachসিনট্যাক্সের অনুমতি দেয় । for each (let val in myObj) console.log(val);
কেটসফগ

2
@ ক্যাটস্পফ: ঠিক আছে, তবে এটি কেবল মজিলা হিসাবে এটি খুব কার্যকর বলে মনে হচ্ছে না।
ফেলিক্স ক্লিং

ধন্যবাদ আপনার উত্তরের জন্য অনেক। আপনার প্রদত্ত তথ্যগুলি আমি পড়ব। উত্তরের শুরুতে আপনার অনুমানটি সঠিক ছিল, আমি জানতাম যে, এই প্রকল্পটি নিয়ে আমি আমার মাথায় এত কিছু পেয়েছি যা আমি ফোকাস করতে পারি না এবং এটি সম্পর্কে ভুলে যাই না .. আপনাকে ধন্যবাদ।
ক্যাবারে


9
for (var key in myMap) {
    if (myMap.hasOwnProperty(key)) {
        console.log("key =" + key);
        console.log("value =" + myMap[key]);
    }
}

জাভাস্ক্রিপ্টে, প্রতিটি অবজেক্টে মেটা-তথ্যযুক্ত অন্তর্নির্মিত কী-মান জোড়ার একটি গুচ্ছ থাকে। আপনি যখন কোনও বস্তুর জন্য সমস্ত কী-মান জোড়ার মধ্য দিয়ে লুপ করেন তখন আপনি সেগুলিও লুপ করছেন। HasOwnProperty () এর ব্যবহার এগুলি ফিল্টার করে।


2

ES6 Map.prototype.forEach (কলব্যাক) সরবরাহ করবে যা এটি এর মতো ব্যবহার করা যেতে পারে

myMap.forEach(function(value, key, myMap) {
                        // Do something
                    });

2
কি myMapজন্য পরামিতি ?
phil294

মানচিত্র কোনও বস্তু নয়। তারা সম্পূর্ণ পৃথক জিনিস।
ডাকুসান

2
ফরইচ ফাংশনে অ্যারের 'কী' থাকে না তবে আপনি বর্তমানে পুনরাবৃত্তি করছেন এমন উপাদানটির আরও সূচক থাকে।
ফ্রান্সিস মলোক

2
let test = {a: 1, b: 2, c: 3};
Object.entries(test).forEach(([key, value]) => console.log(key, value))

// a 1
// b 2
// c 3

5
আপনি যে পোল কোডটি পোস্ট করেছেন তার পরিবর্তে একটি স্পষ্ট কোড পোস্ট করার পরিবর্তে কিছু ব্যাখ্যা যোগ করতে পারেন যা বোধগম্য নয়।
এওওআইই

Object.entries মূল বস্তুর কী / মান জোড়া উপর ভিত্তি করে বিন্যাসের একটি অ্যারের আউট pulls: [['a', 1],['b',2],['c',3]]forEachকী / মান অ্যারে প্রতিটি deconstructs এবং দুটি ভেরিয়েবল সেট করে keyএবং value, আপনি ফাংশনে চান ব্যবহৃত হবে - এখানে আউটপুট console.log
মার্ক সোয়ার্ডস্ট্রম


1

নীচে একটি উদাহরণ যা আপনার কাছে যতটা কাছে যায় তত কাছাকাছি যায়।

for(var key in data){
  var value = data[key];    
  //your processing here
}

আপনি jQuery ব্যবহার করে থাকেন তাহলে দেখুন: http://api.jquery.com/jQuery.each/


1

আপনি যদি লোডাশ ব্যবহার করেন তবে আপনি ব্যবহার করতে পারেন_.forEach

_.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
  console.log(key + ": " + value);
});
// => Logs 'a: 1' then 'b: 2' (iteration order is not guaranteed).

1

এই প্রশ্নটি তৈরি হওয়ার পরে গত কয়েক বছরে জাভাস্ক্রিপ্ট কয়েকটি নতুন বৈশিষ্ট্য যুক্ত করেছে। এর মধ্যে একটি হ'ল অবজেক্ট.এন্ট্রি পদ্ধতি।

MDN থেকে সরাসরি অনুলিপি করা হল অনুসরণ কোড স্নিপেট


const object1 = {
  a: 'somestring',
  b: 42
};

for (let [key, value] of Object.entries(object1)) {
  console.log(`${key}: ${value}`);
}

-2

হ্যাঁ, আপনি জাভাস্ক্রিপ্টে সাহসী অ্যারে রাখতে পারেন:

var obj = 
{
    name:'some name',
    otherProperty:'prop value',
    date: new Date()
};
for(i in obj)
{
    var propVal = obj[i]; // i is the key, and obj[i] is the value ...
}

@ পলপ্রো ... জাভাস্ক্রিপ্টের সমস্ত কিছুই একটি মূল-মূল্য জুড়ি (এইভাবে, কোনও বস্তু আসলে কী-মূল্যের
জোড়গুলির

@ অ্যালেক্সপ্যাকুরার এবং অ্যা্যাসোসিয়েটিভ অ্যারের একটি অর্ডার রয়েছে। একটি অবজেক্ট আনর্ডার্ড করা হয়েছে। না না একটি বড় পার্থক্য
Raynos

@ রায়নোস আপনি ঠিক থাকতে পারেন ... কোন বিষয়টিকে কীভাবে বিন্যস্ত করা হয়েছে তা ঠিক ব্যাখ্যা করার জন্য এটি একটি দুর্দান্ত সাহায্য হবে ... উপরের উদাহরণটি দেখলে, কেউ প্রত্যাশা করবে যে লুপটির জন্য 'i' হবে [নাম, অন্যান্য প্রপোটারি, এবং শেষ অবধি] ... সুতরাং কোন পরিস্থিতিতে কোনও বস্তুর বৈশিষ্ট্যের ক্রম মিশ্রিত হবে?
অ্যালেক্স পাকুরার

@ অ্যালেক্সপ্যাকুরার নির্দিষ্ট অর্ডারে এটি যে বস্তুর উপরে লুপ করবে সেটিকে ব্রাউজার নির্দিষ্ট করা হবে। কেউ এটি বর্ণানুক্রমিকভাবে করেন, কেউ এটি সংজ্ঞা ইত্যাদির ক্রম করেন
রায়নস

3
@ রায়নোস: প্রয়োজনীয় সংঘবদ্ধ অ্যারেগুলি আদেশ করা হয়েছে কি? আমি প্রায়শই এই শব্দটি আরও সাধারণভাবে ব্যবহৃত দেখেছি। উদাহরণস্বরূপ, সহযোগী অ্যারে উইকিপিডিয়া নিবন্ধে
জেরেমি ব্যাংকগুলি

-8
var global = (function() {
   return this;
})();

// Pair object, similar to Python

function Pair(key, value) {
    this.key = key;
    this.value = value;

    this.toString = function() {
       return "(" + key + ", " + value + ")";
    };
}

/**
 * as function
 * @param {String} dataName A String holding the name of your pairs list.
 * @return {Array:Pair} The data list filled
 *    with all pair objects.
 */
Object.prototype.as = function(dataName) {
    var value, key, data;
    global[dataName] = data = [];

    for (key in this) {
       if (this.hasOwnProperty(key)) {
          value = this[key];

          (function() {
             var k = key,
                 v = value;

            data.push(new Pair(k, v));
          })();
       }
    }

    return data;
};

var d = {
   'one': 1,
   'two': 2
};

// Loop on your (key, list) pairs in this way
for (var i = 0, max = d.as("data").length; i < max; i += 1) {
   key = data[i].key;
   value = data[i].value;

   console.log("key: " + key + ", value: " + value);
}

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