একটি জাভাস্ক্রিপ্ট অবজেক্ট উপর পুনরাবৃত্তি কিভাবে?


422

জাভাস্ক্রিপ্টে আমার একটি অবজেক্ট রয়েছে:

{
    abc: '...',
    bca: '...',
    zzz: '...',
    xxx: '...',
    ccc: '...',
    // ...
}

আমি forএর বৈশিষ্ট্য পেতে একটি লুপ ব্যবহার করতে চাই । এবং আমি এটি অংশগুলিতে পুনরাবৃত্তি করতে চাই (সমস্ত বস্তুর বৈশিষ্ট্য একবারে নয়)।

একটি সাধারণ অ্যারে দিয়ে আমি এটি স্ট্যান্ডার্ড forলুপ দিয়ে করতে পারি :

for (i = 0; i < 100; i++) { ... } // first part
for (i = 100; i < 300; i++) { ... } // second
for (i = 300; i < arr.length; i++) { ... } // last

কিন্তু কীভাবে এটি জিনিসগুলির সাথে করবেন?


22
মনে রাখবেন যে বস্তুর বৈশিষ্ট্যগুলি ক্রমে সংরক্ষণ করা হয়নি। আপনি যখন কোনও বস্তুর উপরে পুনরাবৃত্তি করবেন তখন সেগুলি যেভাবে প্রদর্শিত হবে তার কোনও গ্যারান্টি নেই।
জেমস আলার্ডাইস

উত্তর:


850

বেশিরভাগ অবজেক্টের জন্য, ব্যবহার করুন for .. in:

for (let key in yourobject) {
  console.log(key, yourobject[key]);
}

ES6 এর সাহায্যে আপনার যদি একই সাথে কী এবং মান উভয় প্রয়োজন হয় তবে করুন

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

উত্তরাধিকারসূত্রে প্রাপ্ত বৈশিষ্ট্যগুলিতে লগ করা এড়াতে, হস্তআপনপ্রাপ্তির সাথে চেক করুন :

for (let key in yourobject) {
   if (yourobject.hasOwnProperty(key)) {
      console.log(key, yourobject[key]);
   }
}

আপনি hasOwnPropertyযদি কোনও সাধারণ অবজেক্ট ব্যবহার করেন (উদাহরণস্বরূপ আপনি এটি দিয়ে নিজেকে তৈরি করেছেন {}) কীগুলিতে পুনরাবৃত্তি করার সময় আপনাকে পরীক্ষা করার দরকার নেই ।

এই এমডিএন ডকুমেন্টেশনটি আরও সাধারণভাবে ব্যাখ্যা করে যে কীভাবে অবজেক্টস এবং তাদের বৈশিষ্ট্যগুলি মোকাবেলা করতে হয়।

যদি আপনি এটি "খণ্ডগুলিতে" করতে চান তবে একটি অ্যারেতে কীগুলি বের করা ভাল। যেহেতু অর্ডারটি গ্যারান্টিযুক্ত নয়, এটি সঠিক উপায়। আধুনিক ব্রাউজারগুলিতে আপনি ব্যবহার করতে পারেন

let keys = Object.keys(yourobject);

আরও সামঞ্জস্যপূর্ণ হতে, আপনি আরও এটি করতে চাই:

 let keys = [];
 for (let key in yourobject) {      
     if (yourobject.hasOwnProperty(key)) keys.push(key);
 }

তারপরে আপনি সূচক দ্বারা আপনার বৈশিষ্ট্যগুলিতে পুনরাবৃত্তি করতে পারেন yourobject[keys[i]]:

for (let i=300; i < keys.length && i < 600; i++) { 
   console.log(keys[i], yourobject[keys[i]]);
}

3
ওপিকে একক লুপের সমস্ত কী নয়, কিছু অংশে এটি সম্পাদন করতে চায়।
পাভেল

হ্যাঁ. এক লুপে সম্পূর্ণ বস্তু নয়।
nkuhta

2
@ কার্বারাস ওপেন অলরেডি জানে কীভাবে অংশগুলিতে একটি অ্যারে পুনরুক্ত করা যায়। keysপ্রদত্ত কোড থেকে ব্যবহার করা যথেষ্ট হবে।
যোশি

2
@ সার্বারাস মন্তব্য করার আগে পড়ুন! "আরও সামঞ্জস্যপূর্ণ হওয়ার জন্য, আপনি কি এটি আরও ভাল করবেন" এর মধ্যে কী পরিষ্কার নয় ?
অস্বীকার করেছেন সাগুরেট

2
@ am05mhz যেমনটি আমি বলেছি, বেশিরভাগ বস্তুর সাথে এটি অকেজো। তবে সবার জন্য নয়। এটি ব্যবহার করে দেখুন: jsbin.com/hirivubuta/1/edit?js,console
Denys

61

আধুনিক ব্রাউজারগুলির জন্য এখানে আরও একটি পুনরাবৃত্তি সমাধান রয়েছে:

Object.keys(obj)
  .filter((k, i) => i >= 100 && i < 300)
  .forEach(k => console.log(obj[k]));

বা ফিল্টার ফাংশন ছাড়াই:

Object.keys(obj).forEach((k, i) => {
    if (i >= 100 && i < 300) {
        console.log(obj[k]);
    }
});

তবে আপনাকে অবশ্যই বিবেচনা করতে হবে যে জাভাস্ক্রিপ্ট অবজেক্টের বৈশিষ্ট্যগুলি সাজানো নয়, অর্থাত্ কোনও অর্ডার নেই।


যদি আমি লুপটি ভাঙ্গি, এটি পরের বারের অবজেক্টের শুরু থেকে শুরু হবে, এটি সঠিক উপায় নয়।
nkuhta

21

Object.entriesআপনি ব্যবহার করে এই জাতীয় কিছু।

 // array like object with random key ordering
 const anObj = { 100: 'a', 2: 'b', 7: 'c' };
 console.log(Object.entries(anObj)); // [ ['2', 'b'],['7', 'c'],['100', 'a'] ]

অবজেক্ট.এন্ট্রি () পদ্ধতিটি একটি প্রদত্ত বস্তুর নিজস্ব অগণিত সম্পত্তি [কী, মান] এর অ্যারে প্রদান করে

সুতরাং আপনি বস্তুর উপর পুনরাবৃত্তি করতে পারেন keyএবং valueপ্রতিটি বস্তুর জন্য এবং এই জাতীয় কিছু পেতে পারেন।

const anObj = { 100: 'a', 2: 'b', 7: 'c' };
Object.entries(anObj).map(obj => {
   const key   = obj[0];
   const value = obj[1];

   // do whatever you want with those values.
});

বা এই মত

// Or, using array extras
Object.entries(obj).forEach(([key, value]) => {
  console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
});

রেফারেন্সের জন্য অবজেক্ট এন্ট্রিগুলির জন্য MDN ডক্সটি দেখুন


17

নতুন ES6 / ES2015 বৈশিষ্ট্যগুলির সাথে, আপনাকে একটি হ্যাশ দিয়ে পুনরাবৃত্তি করতে আর কোনও জিনিস ব্যবহার করতে হবে না। আপনি একটি মানচিত্র ব্যবহার করতে পারেন । জাভাস্ক্রিপ্ট মানচিত্রগুলি সন্নিবেশ ক্রমে কীগুলি রাখে, এর অর্থ হ্যাশঅনপ্রপার্টি যাচাই না করে আপনি তাদের উপর পুনরাবৃত্তি করতে পারেন, যা সর্বদা সত্যই হ্যাক ছিল।

একটি মানচিত্রে Iterate:

var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
for (var [key, value] of myMap) {
  console.log(key + " = " + value);
}
// Will show 2 logs; first with "0 = zero" and second with "1 = one"

for (var key of myMap.keys()) {
  console.log(key);
}
// Will show 2 logs; first with "0" and second with "1"

for (var value of myMap.values()) {
  console.log(value);
}
// Will show 2 logs; first with "zero" and second with "one"

for (var [key, value] of myMap.entries()) {
  console.log(key + " = " + value);
}
// Will show 2 logs; first with "0 = zero" and second with "1 = one"

বা প্রতিটি জন্য ব্যবহার করুন:

myMap.forEach(function(value, key) {
  console.log(key + " = " + value);
}, myMap)
// Will show 2 logs; first with "0 = zero" and second with "1 = one"

1
ফরইচ হ'ল পছন্দনীয়
পুংগি

14

যদি আপনি পুনরাবৃত্তি করার সময় কী এবং মানটি চান তবে আপনি অবজেক্ট.এন্ট্রিগুলির সাথে ... এর জন্য লুপ ব্যবহার করতে পারেন ।

const myObj = {a: 1, b: 2}

for (let [key, value] of Object.entries(myObj)) {
    console.log(`key=${key} value=${value}`)
}

// output: 
// key=a value=1
// key=b value=2

7

এটি করার একমাত্র নির্ভরযোগ্য উপায় হ'ল আপনার অবজেক্টের ডেটা 2 অ্যারে, একটি কী এবং ডেটার জন্য একটিতে সংরক্ষণ করা:

var keys = [];
var data = [];
for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        keys.push(key);
        data.push(obj[key]); // Not necessary, but cleaner, in my opinion. See the example below.
    }
}

আপনি সাধারণত আপনার মত অ্যারেতে পুনরাবৃত্তি করতে পারেন:

for(var i = 0; i < 100; i++){
    console.log(keys[i], data[i]);
    //or
    console.log(keys[i], obj[keys[i]]); // harder to read, I think.
}
for(var i = 100; i < 300; i++){
    console.log(keys[i], data[i]);
}

আমি ব্যবহার করছি না Object.keys(obj), কারণ এটি IE 9+।


3

-> যদি আমরা কোনও জাভাস্ক্রিপ্ট অবজেক্টের মাধ্যমে পুনরুক্তি করি এবং অবজেক্টগুলির অ্যারের কী খুঁজে পাই

Object.keys(Array).forEach(key => {

 console.log('key',key)

})

1

আপনি যদি একবারে পুরো বস্তুটি পুনরাবৃত্তি করতে চান তবে আপনি for inলুপটি ব্যবহার করতে পারেন :

for (var i in obj) {
  ...
}

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

এর মধ্যে প্রথমটি হ'ল ইতিমধ্যে পঠিত বৈশিষ্ট্যগুলি "অপসারণ":

var i = 0;
for (var key in obj) {
    console.log(obj[key]);
    delete obj[key];
    if ( ++i > 300) break;
}

আর একটি সমাধান যা আমি ভাবতে পারি তা হ'ল অবজেক্টের পরিবর্তে অ্যারে ব্যবহার করা:

var obj = [['key1', 'value1'], ['key2', 'value2']];

তারপরে, স্ট্যান্ডার্ড forলুপ কাজ করবে।


1

অবশেষে অবজেক্টস, স্ট্রিংস, অ্যারে, টাইপড্রাই, ম্যাপস, সিটস (যে কোনও আইটেমারেবলস) পুনরাবৃত্তি করতে ইউনিফাইড ইন্টারফেস সহ একটি হ্যান্ডি ইউটিলিটি ফাংশন নিয়ে এসেছি।

const iterate = require('@a-z/iterate-it');
const obj = { a: 1, b: 2, c: 3 };

iterate(obj, (value, key) => console.log(key, value)); 
// a 1
// b 2
// c 3

https://github.com/alrik/iterate-javascript


1

আপনি লড্যাশ ব্যবহার করে চেষ্টা করতে পারেন - একটি আধুনিক জাভাস্ক্রিপ্ট ইউটিলিটি লাইব্রেরি দ্রুত বস্তু পুনরাবৃত্তি করতে মডুলারিটি, কর্মক্ষমতা এবং অতিরিক্ত জেএস সরবরাহ করে : -

var  users  =   {
    'fred':     { 
        'user':   'fred',
            'age':  40 
    },
    'pebbles':  { 
        'user':   'pebbles',
         'age':  1 
    }
}; 
_.mapValues(users,  function(o)  { 
    return  o.age; 
});
// => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
// The `_.property` iteratee shorthand.
console.log(_.mapValues(users,  'age')); // returns age property & value 
console.log(_.mapValues(users,  'user')); // returns user property & value 
console.log(_.mapValues(users)); // returns all objects 
// => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash-compat/3.10.2/lodash.js"></script>


1

বস্তুর পুনরাবৃত্তির জন্য আমরা সাধারণত একটি for..inলুপ ব্যবহার করি । এই কাঠামোটি প্রোটোটাইপাল উত্তরাধিকারের মাধ্যমে উত্তরাধিকার সূত্রে প্রাপ্ত সমস্ত গণ্য সম্পত্তি সহ লুপ করবে । উদাহরণ স্বরূপ:

let obj = {
  prop1: '1',
  prop2: '2'
}

for(let el in obj) {
  console.log(el);
  console.log(obj[el]);
}

যাইহোক, for..inসমস্ত গণনাযোগ্য উপাদানকে লুপ করবে এবং এটি আমাদের পুনরাবৃত্তিকে খণ্ডগুলিতে ভাগ করতে সক্ষম করবে না। এটি অর্জনের জন্য আমরা Object.keys()অ্যারেতে অবজেক্টের সমস্ত কীগুলি পুনরুদ্ধার করতে বিল্ট ইন ফাংশনটি ব্যবহার করতে পারি । এরপরে আমরা লুপগুলির জন্য পুনরাবৃত্তিকে একাধিক ভাগে ভাগ করতে এবং কী অ্যারে ব্যবহার করে বৈশিষ্ট্য অ্যাক্সেস করতে পারি। উদাহরণ স্বরূপ:

let obj = {
  prop1: '1',
  prop2: '2',
  prop3: '3',
  prop4: '4',
};

const keys = Object.keys(obj);
console.log(keys);


for (let i = 0; i < 2; i++) {
  console.log(obj[keys[i]]);
}


for (let i = 2; i < 4; i++) {
  console.log(obj[keys[i]]);
}


0
var Dictionary = {
  If: {
    you: {
      can: '',
      make: ''
    },
    sense: ''
  },
  of: {
    the: {
      sentence: {
        it: '',
        worked: ''
      }
    }
  }
};

function Iterate(obj) {
  for (prop in obj) {
    if (obj.hasOwnProperty(prop) && isNaN(prop)) {
      console.log(prop + ': ' + obj[prop]);
      Iterate(obj[prop]);
    }
  }
}
Iterate(Dictionary);

1
আসলে না. এটি বোঝা যাচ্ছে যেগুলি Objectঅর্ডারেড। তারা না. If you can make sense of the sentence it workedশুধুমাত্র বাস্তবায়নের বিশদের কারণে কাজ করে। এটি মোটেও কাজ করার গ্যারান্টিযুক্ত নয়। এছাড়াও আপনার নিজের ফাংশন এবং ভেরিয়েবলগুলি টাইটেলকেস করা উচিত নয়। এটি classএস।
ফ্লোরিয়ান ওয়েনডেলবোন

0

সত্যিই একটি পিআইটিএ এটি স্ট্যান্ডার্ড জাভাস্ক্রিপ্টের অংশ নয়।

/**
 * Iterates the keys and values of an object.  Object.keys is used to extract the keys.
 * @param object The object to iterate
 * @param fn (value,key)=>{}
 */
function objectForEach(object, fn) {
    Object.keys(object).forEach(key => {
        fn(object[key],key, object)
    })
}

দ্রষ্টব্য: আমি কলব্যাকের পরামিতিগুলিকে (মান, কী) স্যুইচ করেছি এবং তৃতীয় অবজেক্টটি এপিআই সুসংগত অন্যান্য এপিআইগুলিতে যুক্ত করেছি।

এটি ব্যবহার করুন

const o = {a:1, b:true};
objectForEach(o, (value, key, obj)=>{
    // do something
});

1
প্রথম বাক্যে আপনার বক্তব্যটির জন্য উন্নত। যদিও মানটি প্রথম প্যারামিটার, সূচক বা কী দ্বিতীয় প্যারামিটার এবং অবজেক্ট তৃতীয় প্যারামিটারটি আরও প্রতিটি ইয়ার () এর অ্যারের মতো করে তোলে তবে এটি আরও ভাল হত। আমি যদিও লোডাশের সুপারিশ করব।
চুক্তি বলে আমি সঠিক

আমি (মান, কী) ক্রমের ধারণাটি পছন্দ করি। ভ্যুর মতো একটি লাইব্রেরিও এটি করে। কারণ বস্তুটি প্রসঙ্গ, এটি এটি প্রথম পরামিতি হিসাবে মনে করে as এটি কার্যকরী প্রোগ্রামিংয়ের জন্য বেশ মানক।
স্টিভেন স্পঞ্জিন

আমি এখানে একমত হব, যদি এটি ECMA-262 না হয়ে forEach (), মানচিত্র (), হ্রাস (), ফিল্টার () সম্বলিত কোনও বস্তু হিসাবে অ্যারের সংজ্ঞা দেয়, যা সকলেই অর্ডার গ্রহণকারী কলব্যাকগুলি গ্রহণ করে [মান, সূচক, অ্যারে] । জেএসের কোনও বস্তুকে কেবল অন্য সংগ্রহ হিসাবে বোঝা যায়; এবং তারপরে এই পদ্ধতিগুলি তাদের [মান, কী | সূচক, প্রসঙ্গ] এর প্যারামিটারগুলিতে একীভূত হয়ে উঠেছে (এটি যা লোড্যাশ এবং আন্ডারস্কোর করছে)। আমার মতে, এই "ইউনিফাইড সংগ্রহ" প্রোটোকলটি আরও শক্তিশালী। এছাড়াও, বস্তুর নয় প্রসঙ্গ: আপনি সেট করতে পারেন thisযাই হোক না কেন আপনি, যেমন কলব্যাক এর নিজস্ব প্রসঙ্গের হয়েছে কলব্যাক জন্য পছন্দ করতে।
চুক্তি বলছে আমি

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

ওহ, আমি দেখতে পাচ্ছি যে আমরা একে অপরকে ভুল বুঝে থাকতে পারি। আমি সবসময় কলব্যাকের পরামিতিগুলি এবং তাদের ক্রম সম্পর্কে মন্তব্য করতাম, আসল objectForEachফাংশন সম্পর্কে নয় । দুঃখিত যদি এটি বিভ্রান্তিকর ছিল।
চুক্তি বলে আমি সঠিক

0

হ্যাঁ. লুপের জন্য ব্যবহার করে আপনি কোনও বস্তুর মধ্য দিয়ে লুপ করতে পারেন। এখানে একটি উদাহরণ

var myObj = {
    abc: 'ABC',
    bca: 'BCA',
    zzz: 'ZZZ',
    xxx: 'XXX',
    ccc: 'CCC',
}

var k = Object.keys (myObj);
for (var i = 0; i < k.length; i++) {
    console.log (k[i] + ": " + myObj[k[i]]);
}

দ্রষ্টব্য: উপরে উল্লিখিত উদাহরণটি কেবল আই 9 + এ কাজ করবে। এখানে Objec.keys ব্রাউজার সমর্থন দেখুন ।


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