বস্তুর বৈশিষ্ট্যগুলির মাধ্যমে আইট্রেট করুন


2035

var obj = {
    name: "Simon",
    age: "20",
    clothing: {
        style: "simple",
        hipster: false
    }
}

for(var propt in obj){
    console.log(propt + ': ' + obj[propt]);
}

পরিবর্তনশীল কীভাবে proptবস্তুর বৈশিষ্ট্য উপস্থাপন করে? এটি অন্তর্নির্মিত পদ্ধতি বা সম্পত্তি নয়। কেন এটি বস্তুর প্রতিটি সম্পত্তি নিয়ে আসে?


11
if (typeof(obj[propt]) === 'object') {/ * এটা আবার * / কি}
noob

13
ঠিক আছে, এই প্রশ্নের জন্য সত্যই দুঃখিত। আমি জানি একটি লুপটি কী, আমি "অবজেক্ট প্রোপার্টি দিয়ে লুপিং" এর আশেপাশে আমার মাথা পেতে পারি না, যা আমার মনে হয় এখন সাফ হয়ে গেছে। এছাড়াও, তারা আমাকে "জাভাস্ক্রিপ্ট স্টেপ বাই স্টেপ দ্বিতীয় ধাপের সংস্করণ - স্কিভে স্টিভ সুহরিং"
রাফায়

242
এটি একটি সূক্ষ্ম ভিক্ষুক প্রশ্ন। আমি যুক্ত করব যে অন্যান্য ভাষার সাথে আমার 15 বছরের পেশাগত অভিজ্ঞতা রয়েছে এবং আমার এই উত্তরটির প্রয়োজন। আমি পারলে 2000 যোগ করতাম।
নাথান সি। ট্রেশেচ

60
ক্রেজি, তবে আমি কীভাবে এটি করতে পারি তার বাক্য গঠনটি পুনর্বারণ করার জন্য কয়েক বছর কয়েক বছর পর পর এই পৃষ্ঠায় আসছি। এটি কীভাবে করবেন তা আমি মনে করার উদ্রেক করি না ... আমি কেবল মনে রাখি যে এই পৃষ্ঠাটি এখানে সর্বদা এসও তে থাকে।
এইচডিভ

14
এটি স্ট্যাক ওভারফ্লোতে আমি সবচেয়ে অদ্ভুত পৃষ্ঠাটি দেখেছি। আপনি যদি প্রশ্নটি মনোযোগ সহকারে পড়েন তবে কেবল একটি উত্তর এমনকি আসলে যা বলা হচ্ছে তার উত্তর দেওয়ার চেষ্টা শুরু করে এবং এর স্কোর -6 রয়েছে। সর্বোচ্চ স্কোরিং উত্তর, যা গৃহীত হয়েছিল, কেবল উত্তর দেয় না, তবে কেবল ভুল simply

উত্তর:


2424

বৈশিষ্ট্যগুলির মধ্যে আইট্রেট করার জন্য এই অতিরিক্ত hasOwnPropertyচেকটি প্রয়োজন:

for (var prop in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, prop)) {
        // do stuff
    }
}

এটি প্রয়োজনীয় কারণ কোনও বস্তুর প্রোটোটাইপটিতে অবজেক্টটির প্রযুক্তিগতভাবে অংশ হিসাবে অতিরিক্ত বৈশিষ্ট্য রয়েছে। এই অতিরিক্ত বৈশিষ্ট্যগুলি বেস অবজেক্ট বর্গ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত, তবে এখনও এর বৈশিষ্ট্য obj

hasOwnProperty এটি কেবল এই শ্রেণীর জন্য নির্দিষ্ট সম্পত্তি এবং বেস বর্গ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত নয় তা পরীক্ষা করে দেখুন।


hasOwnPropertyঅবজেক্টের মাধ্যমে নিজে কল করাও সম্ভব :

if (obj.hasOwnProperty(prop)) {
    // do stuff
}

তবে বস্তুটির একই নামের সাথে সম্পর্কযুক্ত ক্ষেত্র থাকলে এটি ব্যর্থ হবে:

var obj = { foo: 42, hasOwnProperty: 'lol' };
obj.hasOwnProperty('foo');  // TypeError: hasOwnProperty is not a function

এজন্য Object.prototypeপরিবর্তে এটি কল করা নিরাপদ :

var obj = { foo: 42, hasOwnProperty: 'lol' };
Object.prototype.hasOwnProperty.call(obj, 'foo');  // true

21
@ বিটি মজিলা ডকুমেন্টেশনের মতে : "আপনি যদি কেবলমাত্র বস্তুর সাথে সংযুক্ত বৈশিষ্ট্যগুলি বিবেচনা করতে চান এবং এর প্রোটোটাইপগুলি না পান, getOwNPropertyNames ব্যবহার করুন বা একটি hasnwropropty চেক সঞ্চালন করুন (সম্পত্তি IsEnumerable এছাড়াও ব্যবহার করা যেতে পারে)"।
ডেভিডমডেম

3
ডাকার আসলে object.hasOwnProperty()কী? যেটির যে propertyকোনও মূল্য রয়েছে তার অর্থ কি এটি বোঝায় না object?
অ্যালেক্স এস

6
কারণ, অ্যালেক্স এস, কোনও সামগ্রীর প্রোটোটাইপটিতে অবজেক্টের জন্য অতিরিক্ত বৈশিষ্ট্য রয়েছে যা প্রযুক্তিগতভাবে বস্তুর অংশ। এগুলি বেস অবজেক্ট বর্গ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত, তবে তারা এখনও বৈশিষ্ট্য। hasOwnProperty কেবল এই শ্রেণীর জন্য নির্দিষ্ট সম্পত্তি কিনা এবং বেস বর্গ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত নয় তা খতিয়ে দেখেন। একটি ভাল ব্যাখ্যা: brianflove.com/2013/09/05/ জাভাস্ক্রিপ্টসহসনপ্রোপার্টি
কাইল রিখটার

87
আমি মনে করি যে আমার উল্লেখ করা উচিত, তবে অবজেক্ট.কিজ (অবজেক্ট) এখন অবজেক্টের কীগুলি পাওয়ার জন্য আরও একটি ভাল সমাধান। মজিলা ডকুমেন্টেশনের লিঙ্ক: বিকাশকারী.মোজিলা.আর.ইন-
কাইল রিখটার

9
তথ্যগুলির একটি গুরুত্বপূর্ণ অংশ অনুপস্থিত। propertyএখানে একটি স্ট্রিং, বলা উচিত ছিল propertyName। অন্যথায় আমার মতো জেএস নতুনদের জন্য বিভ্রান্তি ঘটতে পারে, অর্থাৎ এর ভিতরে কী করা উচিত if
নিওলিস্ক

1135

জাভাস্ক্রিপ্ট ১.৮.৫ অনুসারে আপনি Object.keys(obj)অবজেক্টে নিজেই সংজ্ঞায়িত বৈশিষ্ট্যের অ্যারে পেতে ব্যবহার করতে পারেন (যার জন্য এটি সত্য হয় obj.hasOwnProperty(key))।

Object.keys(obj).forEach(function(key,index) {
    // key: the name of the object key
    // index: the ordinal position of the key within the object 
});

ইন-ইন লুপ ব্যবহারের চেয়ে এটি ভাল (এবং আরও পঠনযোগ্য)।

এটি এই ব্রাউজারগুলিতে সমর্থিত:

  • ফায়ারফক্স (গেকো): 4 (2.0)
  • ক্রোম: 5
  • ইন্টারনেট এক্সপ্লোরার: 9

আরও তথ্যের জন্য মোজিলা বিকাশকারী নেটওয়ার্ক অবজেক্ট.কিজ () এর উল্লেখ দেখুন



3
এবং যদি আপনার পুরানো ব্রাউজারগুলির জন্য সমর্থন প্রয়োজন হয় তবে আপনি এই পলিফিলটি
কাইলমিট

27
এই ভাষাটি নির্মাণকে সমর্থনকারী পরিবেশগুলিতে, এই পদ্ধতিটি অ্যারে.ফরোঞ্চকে কল করার অনুমতি দেয়: Object.keys(myObject).forEach(function(key,index) { //key = the name of the object key //index = the ordinal position of the key within the object });
টড দাম

4
@ এ জে_83৩ (ফেরা) () এর বাইরে বেরোনোর ​​কোনও ভাল উপায় নেই। এই ক্ষেত্রে কিছু () ব্যবহার করুন এবং ভাঙতে সত্যে ফিরে যান
ড্যানিয়েল জেড।

11
কেন এটি ইন-ইন-এর চেয়ে বেশি পঠনযোগ্য? for candidate in candidateStatus... আমার কাছে পঠনযোগ্য বলে মনে হচ্ছে
জোনা

308

মেয়েরা এবং ছেলেরা আমরা 2019 সালে আছি এবং টাইপ করার জন্য আমাদের কাছে এতটা সময় নেই ... সুতরাং আসুন এই দুর্দান্ত অভিনব ECMAScript 2016 করুন:

Object.keys(obj).forEach(e => console.log(`key=${e}  value=${obj[e]}`));

17
ড্যানি আর এর উত্তরের চেয়ে এটি কীভাবে আলাদা?
ক্রিলগার

27
এটি অনেলাইনার এবং ফোরএচের পরিবর্তে মানচিত্র ব্যবহার করে। এবং এছাড়াও কনসোল.লগ স্টেটমেন্ট কিছু লোকের জন্য আকর্ষণীয় হতে পারে।
ফ্র্যাঙ্ক রোথ

সত্যই, যখন এটি কাজ করে না obj=window.performance.memory: - / যেখানে যেমন for inহয়। অর্থাতvar obj = window.performance.memory; for( key in obj ) console.log( 'key=' + key + ' val=' + obj[key] );
Michaelangel007

2
window.performance.memoryকেবল ক্রোম দ্বারা সমর্থিত এবং Object.keys(obj)খালি অ্যারে প্রদান করে। এর সাথে কিছু করার নেই .map
ফ্রাঙ্ক রথ

যদি কেউ এই একক লাইনারটির সাথে একসাথে একাধিক কাজ করার জন্য পুনরায় কাঠামো তৈরি করতে না চায় তবে eআমি এই কথাটি পোস্ট করেছি। এটি মূলত বেশিরভাগ হ্যাশ বাস্তবায়নগুলির ( (key) => (value) )পরিবর্তে এবং এর পরিবর্তে ব্যবহার করে { key => value }তবে এটির আগে আপনাকে যদি এটির মোকাবিলা না করতে হয় তবে এটি আপনাকে আরও ভালভাবে রূপায়িত
kayleeFrye_onDeck

216

এটি for...in statement( MDN , ECMAScript বৈশিষ্ট )।

আপনি এটা পড়তে পারেন হিসাবে " জন্য যে সম্পত্তি ইনobj বস্তু, প্রতিটি সম্পত্তি নির্ধারিত PROPT পরিবর্তনশীল ঘুরে"।


1
অনেক ধন্যবাদ, আমি এখন এটি বুঝতে। আমি মাথা ঠেকছিলাম, বই এবং গুগল দিয়ে যাচ্ছিলাম।
রাফায়

21
@RightSaidFred, সম্মত inঅপারেটর এবং forবিবৃতি সব সময়ে জড়িত হয় না, for-inবিবৃতি : তার নিজস্ব একটি ব্যাকরণ উৎপাদন প্রতিনিধিত্ব করে for ( LeftHandSideExpression in Expression ),for ( var VariableDeclarationNoIn in Expression )
, CMS

2
অদ্ভুত এই উত্তরটিতে অনেক বেশি ভোট রয়েছে, বিশেষত যেহেতু এই জনপ্রিয় মন্তব্যগুলি এর বিরোধিতা করে বলে মনে হচ্ছে।
ডগ মোলিনাক্স

9
কেন এটি উত্তর হিসাবে চিহ্নিত করা হয়? এটি সম্ভবত এই থ্রেডের সবচেয়ে কম সহায়ক ...
গণনা

3
সবচেয়ে কম সহায়ক উত্তর? ওপি কী জিজ্ঞাসা করেছিল তা নির্ভর করে; আমি যখন প্রথম প্রশ্নটি পড়েছিলাম তখন মনে হয়েছিল যে কোনও প্রক্রিয়াটি যার মাধ্যমে কোনও ভেরিয়েবল কোনও জিনিসের বৈশিষ্ট্যগুলি পরীক্ষা করতে ব্যবহার করা যেতে পারে এবং যা এই উত্তরটি স্পষ্টভাবে ব্যাখ্যা করে ('ইন-ইন' মিসনোমার সত্ত্বেও) ব্যাখ্যা করে b প্রশ্ন আমি পরোক্ষভাবে পারে ওপি hasOwnProperty খুঁজছেন ছিল কিন্তু এটা জানে না দেখুন "কেন এটা যে সম্পত্তি সঙ্গে আসা পর্যন্ত নেই", কিন্তু আমি মনে করি এটা সম্ভাবনা বেশি রয়েছে এই কি ওপি জানতে চেয়েছিলেন ছিল, এবং ভুল একটি সঠিক স্বীকার করেছে একটি পৃথক প্রশ্নের উত্তর। :-)
Bumpy

157

ইএস-এর আপ-টু-ডেট বাস্তবায়নে আপনি ব্যবহার করতে পারেন Object.entries:

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

অথবা

Object.entries(obj).forEach(([key, value]) => ...)

যদি আপনি কেবল মানগুলি নিয়ে পুনরাবৃত্তি করতে চান তবে অবজেক্ট.ভ্যালুগুলি ব্যবহার করুন:

for (const value of Object.values(obj)) { }

অথবা

Object.values(obj).forEach(value => ...)

এটি সেরা সমাধান (অবজেক্ট.এন্ট্রি ...) হবে তবে আমি এটি ব্যবহার করতে পারি না। আপনি যখন একাধিকবার এটি করতে চান এবং এটি আপনার কাঠামোয় সমর্থন করতে না পারেন, আপনি এই পৃষ্ঠায় পলিফিল ব্যবহার করতে পারেন: বিকাশকারী.মোজিলা.আর.এল
মারিও

তৃতীয় পরামর্শটি দুর্দান্ত যদি আপনি কেবলমাত্র বৈশিষ্ট্যের মান values অসাধারণ!
জিনজবার্গ


27

যদি আপনার পরিবেশ ES2017 সমর্থন করে তবে আমি অবজেক্ট.এন্ট্রিগুলি সুপারিশ করব :

Object.entries(obj).forEach(([key, value]) => {
  console.log(`${key} ${value}`);
});

মজিলাস অবজেক্ট.এন্ট্রি () ডকুমেন্টেশনে যেমন প্রদর্শিত হয়েছে :

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

মূলত অবজেক্ট.এন্ট্রিগুলির সাহায্যে আমরা লুপে ...

// This step is not necessary with Object.entries
if (object.hasOwnProperty(property)) {
  // do stuff
}

22

jquery আপনাকে এখন এটি করতে দেয়:

$.each( obj, function( key, value ) {
  alert( key + ": " + value );
});

1
$.each({foo:1, length:0, bar:2}, function(k,v){console.log(k,v)})ea .চچ বস্তুর জন্য উপযুক্ত নয় । যদি কোনও বস্তুর দৈর্ঘ্যের সম্পত্তি থাকার ঘটনা ঘটে এবং এর মান শূন্য হয় তবে পুরো বস্তুটিকে এমন মনে করা হয় যেন এটি খালি অ্যারে হয়।
বব স্টেইন

আমি কেন এটি একটি বাগ-আমন্ত্রণ পদ্ধতি বলে মনে করি বিশদ
বব স্টেইন

21

ডোমিনিকের উত্তরটি নিখুঁত, আমি কেবল সেভাবেই এটি করতে পছন্দ করি, কারণ এটি পড়া ভাল:

for (var property in object) {
    if (!object.hasOwnProperty(property)) continue;

    // Do stuff...
}

Objectবড় হাতের সাথে থাকা উচিত , না?
জনাথন

18

উপরের উত্তরগুলি কিছুটা বিরক্তিকর কারণ তারা লুপটির ভিতরে আপনি কী করছেন তা কোনও বস্তু নিশ্চিত করার পরে তারা ব্যাখ্যা করে না: আপনি এটি সঠিকভাবে অ্যাক্সেস করবেন না! আপনাকে কেবলমাত্র কেইই সরবরাহ করা হয়েছে যা আপনাকে ওবিজেতে প্রয়োগ করতে হবে:

var obj = {
  a: "foo",
  b: "bar",
  c: "foobar"
};

// We need to iterate the string keys (not the objects)
for(var someKey in obj)
{
  // We check if this key exists in the obj
  if (obj.hasOwnProperty(someKey))
  {
    // someKey is only the KEY (string)! Use it to get the obj:
    var myActualPropFromObj = obj[someKey]; // Since dynamic, use [] since the key isn't literally named "someKey"

    // NOW you can treat it like an obj
    var shouldBeBar = myActualPropFromObj.b;
  }
}

এটি সমস্ত ইসিএমএ 5 নিরাপদ। এমনকি গণ্ডার মতো খোঁড়া জেএস সংস্করণেও কাজ করে;)


15

ES2015 এর ব্যবহার যুক্ত করতে Reflect.ownKeys(obj)এবং কোনও পুনরুক্তারের মাধ্যমে বৈশিষ্ট্যের উপরে পুনরাবৃত্তি করতে।

উদাহরণ স্বরূপ:

let obj = { a: 'Carrot', b: 'Potato', Car: { doors: 4 } };

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

// logs each key
Reflect.ownKeys(obj).forEach(key => console.log(key));

আপনি যদি কোনও iteratorসামগ্রীর কীগুলির মানগুলির উপরে সরাসরি পুনরাবৃত্তি করতে চান, আপনি স্ট্রিং, অ্যারে, টাইপ করা অ্যারে, মানচিত্র এবং সেটগুলির জন্য জাভাস্কিপ্টসের ডিফল্ট পুনরাবৃত্তির মতো একটিকেও সংজ্ঞায়িত করতে পারেন ।

জেএস ডিফল্ট পুনরাবৃত্ত সম্পত্তিটির মাধ্যমে পুনরাবৃত্তি করার চেষ্টা করবে, যা অবশ্যই হিসাবে সংজ্ঞায়িত করা উচিত Symbol.iterator

আপনি যদি সমস্ত বস্তুর উপরে পুনরাবৃত্তি করতে সক্ষম হতে চান তবে আপনি এটিকে অবজেক্টের প্রোটোটাইপ হিসাবে যুক্ত করতে পারেন:

Object.prototype[Symbol.iterator] = function*() { 
    for(p of Reflect.ownKeys(this)){ yield this[p]; }
}

এটি আপনাকে লুপের ... এর সাথে একটি অবজেক্টের মানগুলিতে পুনরাবৃত্তি করতে সক্ষম করবে, উদাহরণস্বরূপ:

for(val of obj) { console.log('Value is:' + val ) }

সতর্কতা : এই উত্তরটি লিখতে (জুন 2018) অন্যান্য সমস্ত ব্রাউজার, তবে আইই, এর for...ofমাধ্যমে জেনারেটর এবং পুনরুক্তি সমর্থন করেSymbol.iterator


যদিও আপনি আসলে ওপি-র প্রশ্নের উত্তর দিচ্ছেন না, এটি আমার পক্ষে খুব সহায়ক ছিল, আমি এখনও প্রতিচ্ছবি সম্পর্কে জানতাম না।
মিশিগেল

14
if(Object.keys(obj).length) {
    Object.keys(obj).forEach(key => {
        console.log("\n" + key + ": " + obj[key]);
    });
}

// *** Explanation line by line ***

// Explaining the bellow line
// It checks if obj has at least one property. Here is how:
// Object.keys(obj) will return an array with all keys in obj
// If there is no keys in obj, it will return empty array = []
// Then it will get it's length, if it has at least one element,
// it's bigger than 0 which evaluates to true and the bellow 
// code will be executed.
// Else means it's length = 0 which evaluates to false
// NOTE: you can use Object.hasOwnProperty() instead of Object.keys(obj).length
if(Object.keys(obj).length) {

    // Explaining the bellow line
    // Just like in the previous line, this returns an array with
    // all keys in obj (because if code execution got here, it means 
    // obj has keys.) 
    // Then just invoke built-in javascript forEach() to loop
    // over each key in returned array and calls a call back function 
    // on each array element (key), using ES6 arrow function (=>)
    // Or you can just use a normal function ((key) { blah blah }).
    Object.keys(obj).forEach(key => {

        // The bellow line prints out all keys with their 
        // respective value in obj.
        // key comes from the returned array in Object.keys(obj)
        // obj[key] returns the value of key in obj
        console.log("\n" + key + ": " + obj[key]);
    });
}

3
হাই, আপনি নিজের উত্তর সম্পর্কে আরও তথ্য যুক্ত করতে পারেন, কেবল কোড সরবরাহ করলে কোনও লাভ হয় না।
নিকোলাস

হাই @ নিকোলাস আমি কোডটিতে লাইন ব্যাখ্যা দ্বারা একটি লাইন যুক্ত করেছি। এটি এখনও পরিষ্কার না থাকলে আমাকে জানতে দিন
ফুয়াদ বোক্রেডাইন

forEach খালি মানগুলি এড়িয়ে যাওয়ার কারণে , আমি মনে করি আপনি Object.keys(obj).forEach(e => console.log(`key=${e} value=${obj[e]}`));ফ্র্যাঙ্ক রোথের উত্তরটির মতো এবং যদি এটি করতে পারেন তবে আপনি এ থেকে মুক্তি পেতে পারেন ।
ডার্কপ্রডাক্ট

12

লুপ ইন ... লুপের জন্য প্রতিটি বস্তুর প্রতিনিধিত্ব করে কারণ এটি লুপের মতোই। আপনি এর জন্য ... লুপে প্রপটটি সংজ্ঞায়িত করেছেন:

    for(var propt in obj){
alert(propt + ': ' + obj[propt]);
}

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

    for(var propt in obj) {
      console.log(propt);//logs name
      console.log(obj[propt]);//logs "Simon"
    }

ভেরিয়েবলের ভেরিয়েবলের মান থেকে কীভাবে আলাদা হয় তা আপনি দেখতে পারবেন। বিপরীতে, এর জন্য ... একটি লুপ বিপরীতে করে।

আশা করি এটা কাজে লাগবে.


11
let obj = {"a": 3, "b": 2, "6": "a"}

Object.keys(obj).map((item) => {console.log("item", obj[item])})

// a
// 3
// 2

1
যেমন অন্যান্য মন্তব্যে উল্লিখিত forEachহয়েছে, এখানে আরও উপযুক্ত, যেমন mapপ্রতিটি পুনরাবৃত্তিতে কোড ব্লককে কল করার ফলাফল সহ একটি নতুন অ্যারে ফেরত দেওয়ার উদ্দেশ্যে intended তবে আমরা কেবল প্রতিটির পুনরাবৃত্তির প্রভাবের দিকেই আগ্রহী, প্রত্যাবর্তনের মান নয়, সুতরাং আমাদের যে নতুন অ্যারে mapদেয় তা আমাদের দরকার নেই।
ড্যানি


10

আপনি লোডাশ ব্যবহার করতে পারেন। ডকুমেন্টেশন

var obj = {a: 1, b: 2, c: 3};
_.keys(obj).forEach(function (key) {
    ...
});

10
কেন পৃথিবীতে এই "উত্তর" এর 10 টি upvotes আছে? এটি প্রশ্নের উত্তর দিতে সম্পূর্ণ ব্যর্থ। আমি গড় জেএস বিকাশকারী বুদ্ধিমত্তার উপর বিশ্বাস হারাতে শুরু করি।
বিকাশ

1
@ উন্নয়নশীল আমি বুঝতে পারি যে ES6 বৈশিষ্ট্যগুলি ব্যবহার করা আরও সঠিক উপায়, তবে আমি এক বছর আগে উত্তর দিয়েছি। আপনার এক মিনিট সময় থাকলে দয়া করে আপনার সাথে আমাদের চিন্তাভাবনা করুন।
ভিক্টরপুঙ্কো

1
ব্যবহারকারীকে তাদের পৃষ্ঠায় একটি 10000 লাইনের লাইব্রেরি যুক্ত করার পরিবর্তে দেশীয় পদ্ধতিগুলিতে আরও ফোকাস করা ধারণাটি। আমাকে ভুল করবেন না, আমি লোডাশ ব্যবহার করা পছন্দ করি তবে এর জন্য একটি সময় এবং জায়গা রয়েছে এবং এটি এটি নয়।

9

আপনার forলুপটি অবজেক্টের সমস্ত বৈশিষ্ট্যের উপরে পুনরাবৃত্তি করছে objproptলুপের জন্য আপনার প্রথম লাইনে সংজ্ঞায়িত করা হয়েছে। এটি এমন একটি স্ট্রিং যা objবস্তুর কোনও সম্পত্তির নাম । লুপের প্রথম পুনরাবৃত্তিতে propt"নাম" হবে।


9

জাভাস্ক্রিপ্টে অবজেক্টগুলি সম্পত্তিগুলির সংগ্রহ এবং তাই প্রতিটি বিবৃতিতে লুপ করা যায়।

আপনার objএকটি মূল মান সংগ্রহ হিসাবে ভাবা উচিত ।


! এই 'বৈশিষ্ট্যগুলির তালিকাগুলিতে' কী হিসাবে নাম থাকতে পারে এমন গুরুত্বপূর্ণ পার্থক্যের সাথে, যখন সাধারণ জেএস অ্যারেগুলিতে কেবল কী হিসাবে সংখ্যা থাকতে পারে।
কিউকিউইউ

9

আজকাল আপনি কেবলমাত্র একটি Symbol.iterator পদ্ধতি যোগ করে একটি স্ট্যান্ডার্ড জেএস অবজেক্টকে একটি পুনরাবৃত্ত বস্তুতে রূপান্তর করতে পারেন। তারপরে আপনি একটি for ofলুপ ব্যবহার করতে পারেন এবং এর মানগুলি সরাসরি অ্যাক্সেস করতে পারেন বা এমনকি বস্তুর উপর একটি স্প্রেড অপারেটরও ব্যবহার করতে পারেন। কুল। আসুন আমরা এটি কীভাবে তৈরি করতে পারি তা দেখুন:

var o = {a:1,b:2,c:3},
    a = [];
o[Symbol.iterator] = function*(){
                       var ok = Object.keys(this);
                            i = 0;
                       while (i < ok.length) yield this[ok[i++]];
                     };
for (var value of o) console.log(value);
// or you can even do like
a = [...o];
console.log(a);


1
এটি করার জন্য আকর্ষণীয় উপায়। function*আবিষ্কারের জন্য ধন্যবাদ !
বেঞ্জ

5

নোড চালানো হলে আমি সুপারিশ করব:

Object.keys(obj).forEach((key, index) => {
    console.log(key);
});

5

শীর্ষ-রেট করা উত্তরটি সঠিক হলেও, এখানে একটি বিকল্প ব্যবহারের মামলা রয়েছে যদি আপনি কোনও বস্তুর উপরে পুনরাবৃত্তি করেন এবং শেষ পর্যন্ত একটি অ্যারে তৈরি করতে চান। .mapপরিবর্তে ব্যবহার করুনforEach

const newObj = Object.keys(obj).map(el => {
    //ell will hold keys 
   // Getting the value of the keys should be as simple as obj[el]
})

4

পুনরাবৃত্তির উপায় যুক্ত করুন:

function iterate(obj) {
    // watch for objects we've already iterated so we won't end in endless cycle
    // for cases like var foo = {}; foo.bar = foo; iterate(foo);
    var walked = [];
    var stack = [{obj: obj, stack: ''}];
    while(stack.length > 0)
    {
        var item = stack.pop();
        var obj = item.obj;
        for (var property in obj) {
            if (obj.hasOwnProperty(property)) {
                if (typeof obj[property] == "object") {
                  // check if we haven't iterated through the reference yet
                  var alreadyFound = false;
                  for(var i = 0; i < walked.length; i++)
                  {
                    if (walked[i] === obj[property])
                    {
                      alreadyFound = true;
                      break;
                    }
                  }
                  // new object reference
                  if (!alreadyFound)
                  {
                    walked.push(obj[property]);
                    stack.push({obj: obj[property], stack: item.stack + '.' + property});
                  }
                }
                else
                {
                    console.log(item.stack + '.' + property + "=" + obj[property]);
                }
            }
        }
    }
}

ব্যবহার:

iterate({ foo: "foo", bar: { foo: "foo"} }); 

1
@ ফাইজ - আমার মন্তব্য দেখুন, আপনি যখন
ঘন ঘন

3

লুপের জন্য কী তা হ'ল এটি একটি নতুন ভেরিয়েবল তৈরি করে (var কিছু পরিবর্তনশীল) এবং তারপরে প্রদত্ত বস্তুর প্রতিটি সম্পত্তি এই নতুন ভেরিয়েবলে (কিছু পরিবর্তনশীল) এক এক করে সংরক্ষণ করে। অতএব আপনি যদি ব্লক use use ব্যবহার করেন তবে আপনি পুনরাবৃত্তি করতে পারেন। নিম্নলিখিত উদাহরণ বিবেচনা করুন।

var obj = {
     name:'raman',
     hobby:'coding',
     planet:'earth'
     };

for(var someVariable in obj) {
  //do nothing..
}

console.log(someVariable); // outputs planet

এটিকে প্রাধান্য দেওয়া, এটি সরলতার কারণে। আমার ব্যবহারের ক্ষেত্রে আমাকে অজানা মানগুলির জন্য একটি বস্তুর সমস্ত বৈশিষ্ট্যগুলি পরীক্ষা করতে হবে - ন্যান, নালস, অপরিজ্ঞাত (তারা কোনও গ্রাফের পয়েন্ট ছিল এবং এই মানগুলি গ্রাফটি অঙ্কন থেকে বাধা দিয়েছে)। নামের পরিবর্তে মান পেতে, লুপে আপনি ঠিক করবেন obj[someVariable]। সম্ভবত এটি এতটা নিম্নচ্যুত হওয়ার কারণ হ'ল এটি পুনরুক্ত নয়। সুতরাং আপনার যদি উচ্চ কাঠামোগত কোনও জিনিস থাকে তবে এটি পর্যাপ্ত সমাধান হবে না।
ক্যাথারিন

@ কাঠারিনসোবার্ন বা সম্ভবত এটি কারণ নিম্নলিখিত বাক্যটি কিছুটা রহস্যজনক: "সুতরাং আপনি যদি ব্লক {use ব্যবহার করেন তবে আপনি পুনরাবৃত্তি করতে পারেন can" কোডটি পাঠ্যের চেয়ে বেশি বলে।
বিভিডিবি

3

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

function iterate(obj,parent_node) {
    parent_node = parent_node || '';
    for (var property in obj) {
        if (obj.hasOwnProperty(property)) {
            var node = parent_node + "/" + property;
            if(obj[property] instanceof Array) {
                //console.log('array: ' + node + ":" + obj[property]);
                iterate(obj[property],node)
            } else if(obj[property] instanceof Object){
                //console.log('Object: ' + node + ":" + obj[property]);
                iterate(obj[property],node)
            }
            else {
                console.log(node + ":" + obj[property]);
            }
        }
    }
}

দ্রষ্টব্য - আমি ওন্দ্রেজ স্বেজদার উত্তরটি দ্বারা অনুপ্রাণিত। তবে এই সমাধানটির আরও ভাল পারফরম্যান্স এবং কম অস্পষ্টতা রয়েছে


3

আপনি অবজেক্টে প্রতিটি সম্পত্তি লুপ করতে চান।

JSFiddle

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);

obj(prop)<- TypeError:
আপত্তি

@ আমার_আমার খারাপ। আমার অবশ্যই দুর্ঘটনাক্রমে hasOwnPropertyগুণটি বের করে আনা উচিত । এটি এখন কাজ করা উচিত।
হোভিটেক

2

আমি উপরের উত্তরগুলিতে যুক্ত করতে চাই কারণ জাভাস্ক্রিপ্ট থেকে আপনার ভিন্ন উদ্দেশ্য থাকতে পারে। একটি JSON অবজেক্ট এবং একটি জাভাস্ক্রিপ্ট অবজেক্ট আলাদা জিনিস এবং আপনি উপরে প্রস্তাবিত সমাধানগুলি ব্যবহার করে কোনও JSON অবজেক্টের বৈশিষ্ট্যগুলি দিয়ে পুনরাবৃত্তি করতে চান এবং তারপরে অবাক হয়ে যেতে পারেন।

মনে করুন যে আপনার মতো একটি JSON অবজেক্ট রয়েছে:

var example = {
    "prop1": "value1",
    "prop2": [ "value2_0", value2_1"],
    "prop3": {
         "prop3_1": "value3_1"
    }
}

এর 'বৈশিষ্ট্যগুলি' দিয়ে পুনরাবৃত্তি করার ভুল উপায়:

function recursivelyIterateProperties(jsonObject) {
    for (var prop in Object.keys(example)) {
        console.log(prop);
        recursivelyIterateProperties(jsonObject[prop]);
    }
}

আপনি কনসোল লগিং এইজন্য বিস্মিত হতে পারে 0, 1ইত্যাদি যখন iterating বৈশিষ্ট্য মাধ্যমে prop1এবং prop2এবংprop3_1 । এই অবজেক্টগুলি সিকোয়েন্স, এবং সিকোয়েন্সের সূচকগুলি জাভাস্ক্রিপ্টে সেই বস্তুর বৈশিষ্ট্য।

একটি JSON অবজেক্ট বৈশিষ্ট্যগুলির মাধ্যমে পুনরাবৃত্তভাবে পুনরাবৃত্তি করার একটি ভাল উপায় হ'ল প্রথমে পরীক্ষা করা উচিত object বস্তুটি ক্রম কিনা?

function recursivelyIterateProperties(jsonObject) {
    for (var prop in Object.keys(example)) {
        console.log(prop);
        if (!(typeof(jsonObject[prop]) === 'string')
            && !(jsonObject[prop] instanceof Array)) {
                recursivelyIterateProperties(jsonObject[prop]);

            }

     }
}

1

গৃহীত উত্তরটিকে আরও পরিমার্জন করার জন্য এটি লক্ষণীয় যে আপনি যদি কোনওটির সাহায্যে অবজেক্টটি ইনস্ট্যান্ট করেন var object = Object.create(null)তবে object.hasOwnProperty(property)টাইপআরার ট্রিগার করবে। নিরাপদ দিকে থাকতে, আপনাকে প্রোটোটাইপ থেকে এটির কল করতে হবে:

for (var property in object) {
    if (Object.prototype.hasOwnProperty.call(object, property)) {
        // do stuff
    }
}

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