আমি কীভাবে কোনও জাভাস্ক্রিপ্ট অবজেক্টটি লুপ করব বা গণনা করব?


2874

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

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

এখন আমি সব দিয়ে লুপ করতে চান pউপাদানের ( p1, p2, p3...) তাদের কী ও মান পেতে। আমি এটা কিভাবে করবো?

প্রয়োজনে আমি জাভাস্ক্রিপ্ট অবজেক্টটি সংশোধন করতে পারি। আমার চূড়ান্ত লক্ষ্যটি হ'ল কিছু মূল মান সংযোগগুলি লুপ করা এবং সম্ভব হলে আমি ব্যবহার এড়াতে চাই eval


9
অবজেক্ট ল্যাটারালস এবং জেএসএন-এর বিভ্রান্তি এড়াতে আমি জেএসএনকে জাভাস্ক্রিপ্ট (অবজেক্ট) এ পরিবর্তন করেছি।
ফেলিক্স ক্লিং

উত্তর:


4362

for-inঅন্যরা দেখানো হিসাবে আপনি লুপটি ব্যবহার করতে পারেন । তবে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনি যে কীটি পেয়েছেন তা কোনও বস্তুর আসল সম্পত্তি এবং প্রোটোটাইপ থেকে আসে না।

এখানে স্নিপেট:

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

for (var key in p) {
    if (p.hasOwnProperty(key)) {
        console.log(key + " -> " + p[key]);
    }
}

অবজেক্ট.কিজ () বিকল্পের সাথে:

var p = {
    0: "value1",
    "b": "value2",
    key: "value3"
};

for (var key of Object.keys(p)) {
    console.log(key + " -> " + p[key])
}

এর for-ofপরিবর্তে ব্যবহারের বিষয়টি লক্ষ্য করুন for-in, যদি এটি ব্যবহার না করা হয় তবে এটি নামের বৈশিষ্ট্যগুলিতে অপরিবর্তিত ফিরে আসবে এবং Object.keys()সম্পূর্ণ প্রোটোটাইপ-চেইন বৈশিষ্ট্য ছাড়াই কেবলমাত্র বস্তুর নিজস্ব বৈশিষ্ট্যগুলির ব্যবহার নিশ্চিত করে

নতুন Object.entries()পদ্ধতি ব্যবহার করে :

দ্রষ্টব্য: এই পদ্ধতিটি স্থানীয়ভাবে এক্সপ্লোরার দ্বারা সমর্থিত নয়। আপনি পুরানো ব্রাউজারগুলির জন্য একটি পলিফিল ব্যবহার বিবেচনা করতে পারেন।

const p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

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

34
আপনি কেবল সতর্কতার জন্য সতর্কতা রেখা পরিবর্তন করার প্রস্তাব দিচ্ছেনalert(key + " -> " + JSON.stringify(p[key]));
স্টিভ মিডলেলি

80
আপনি কি হাইপপ্রোপার্টিটির প্রয়োজনীয়তা ব্যাখ্যা করতে পারেন? প্রোটোটাইপ বলতে কী বোঝ?
কামসি

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

57
আসলে, জন্য ... ইন অবচয় করা হয় না। প্রতিটি জন্য ... হয়। তবে আমি আসলে প্রত্নতাত্ত্বিকদের শব্দটি পছন্দ করি ... আমাকে এটি ব্যবহার শুরু করতে হবে।
বেন ওয়াই

17
জাভাস্ক্রিপ্টের প্রতিটি বস্তুর (প্রকৃতপক্ষে একটি মূল-মান জুটি) একটি সম্পত্তি __proto__বা বলা হয় prototype। এই সম্পত্তিটির প্যারেন্ট অবজেক্টের একটি রেফারেন্স রয়েছে। একটি বস্তু স্বয়ংক্রিয়ভাবে তার পিতামাতার কাছ থেকে সম্পত্তি উত্তরাধিকার সূত্রে প্রাপ্ত। এটি ব্যবহারের কারণ hasOwnProperty, যা প্রমাণ করে যে আমরা বস্তুর মালিকানা পাই তার মালিকদের নয়।
জুবায়ের আলম

1102

ECMAScript 5 এর অধীনে, আপনি একত্রিত করতে পারেন Object.keys()এবং Array.prototype.forEach():

var obj = { first: "John", last: "Doe" };

Object.keys(obj).forEach(function(key) {
    console.log(key, obj[key]);
});

ECMAScript 6 যোগ করেছে for...of:

for (const key of Object.keys(obj)) {
    console.log(key, obj[key]);
}

ECMAScript 8 যুক্ত করে Object.entries()যা মূল অবজেক্টে প্রতিটি মান সন্ধান করা এড়িয়ে যায়:

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

আপনি একত্রিত করতে পারেন for...of, ধ্বংস করতে পারেন এবং Object.entries:

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

লুপ হিসাবে একই ক্রমে উভয় Object.keys()এবং Object.entries()পুনরাবৃত্তি বৈশিষ্ট্য কিন্তু প্রোটোটাইপ চেইন উপেক্ষা করুন । কেবলমাত্র অবজেক্টের নিজস্ব সংখ্যাযুক্ত বৈশিষ্ট্য পুনরাবৃত্তি হয়।for...in


21
মান কেন সরবরাহ করলো না Object.forEach(obj, function (value, key) {...})? :( অবশ্যই obj.forEach(function...)ছোট অথবা সম্পূরক হবে Array.prototype.forEach, কিন্তু যে বস্তু তাদের নিজস্ব সংজ্ঞায়িত থাকার ঝুঁকি হবে forEachসম্পত্তি আমি অনুমান। Object.keysবস্তুর কী পরিবর্তন কলব্যাক বিরুদ্ধে রক্ষিবাহিনী।
ডেভিড Harkness

7
Object.forEach = function (obj, callback) { Object.keys(obj).forEach(function (key) { callback(obj[key], key); }); }
ডেভিড হার্কনেস

7
@ ডেভিড হার্কনেস ES2017 এ অবজেক্ট.এন্ট্রি রয়েছে। সেখানে আপনি নিম্নলিখিতটি করতে পারেন: Object.entries(obj).map/forEach(([key, value]) => console.log(key, value))([কী, মান] হ'ল অ্যারে
ডিস্ট্রাকচারিং

আমি কীভাবে indexজসনের চাবিটি পেতে পারি ? অথবা প্রয়োজনে আমার আলাদা কাউন্টার ব্যবহার করা উচিত?
সারাওয়ানবালাগী রামচন্দ্রন

3
for...ofES6 স্ট্যান্ডার্ড, ES2016 নয়।
রাক্স ওয়েবার

341

আপনাকে ইন-লুপটি ব্যবহার করতে হবে

তবে এই ধরণের লুপটি ব্যবহার করার সময় খুব সতর্কতা অবলম্বন করুন, কারণ এটি প্রোটোটাইপ চেইনের পাশাপাশি সমস্ত বৈশিষ্ট্য লুপ করবে ।

অতএব, ইন-লুপগুলি ব্যবহার করার সময়, hasOwnPropertyপুনরাবৃত্তির বর্তমান সম্পত্তিটি আপনি যে বস্তুর উপর যাচাই করছেন তা সত্যিই সেই সম্পত্তি কিনা তা নির্ধারণ করার জন্য সর্বদা পদ্ধতিটি ব্যবহার করুন:

for (var prop in p) {
    if (!p.hasOwnProperty(prop)) {
        //The current property is not a direct property of p
        continue;
    }
    //Do your logic with the property here
}

31
এটি লেভিকের সমাধানের চেয়ে ভাল কারণ এটি মূল যুক্তিকে দু'জনের পরিবর্তে কেবলমাত্র একটি নেস্টেড লুপের অনুমতি দেয়; কোড পড়তে সহজ করে তোলে making যদিও আমি বন্ধনীটি বন্ধের চারপাশে আলগা করব; তারা অতিশয় হয়।
সিস্টেমেপ্লিউরাল

52
আমি { }ব্যক্তিগতভাবে সরিয়ে ফেলব না কারণ ifএগুলি ব্যতীত এটিকে কিছুটা স্পষ্ট করে দেয় যে কোনটির অংশ ifএবং কী নয়। তবে আমার ধারণা এটি কেবল মতামতের বিষয় :)
pimvdb

34
হ্যাঁ, আমি { }প্রাথমিকভাবে বিভ্রান্তি এড়াতে অগ্রাধিকার দিচ্ছি যদি কারও পরে যদি এই ifসুযোগে কিছু যুক্ত করার প্রয়োজন হয় ।
অ্যান্ড্রেস গ্রেচ

8
আমার পূর্ববর্তী মন্তব্যটি পড়ে, আমি বুঝতে পারি যে আমি সঠিক পদ ব্যবহার করিনি, কারণ আমি বলেছি "যদি সুযোগ"; তবে মনে রাখবেন যে জাভাস্ক্রিপ্টের কেবলমাত্র কার্যকারিতা রয়েছে। সুতরাং আমি আসলে যা বোঝাতে চেয়েছি তা ছিল "যদি ব্লক"।
আন্দ্রে গ্রাচ

1
ইওমরফ, আপনি যদি সত্যিই উদ্বিগ্ন হন তবে আপনি সর্বদা এর মতো কিছু করতে পারেন: Object.prototype.hasOwnProperty.call(p, prop) তবে এটি খুব সহজেই
অবজেক্ট.প্রোটোটাইপগুলিতে হেরফের

253

যদি আমরা বস্তুর মধ্য দিয়ে লুপিংয়ের বিকল্প পদ্ধতি সম্পর্কে উল্লেখ না করি তবে প্রশ্নটি সম্পূর্ণ হবে না।

আজকাল অনেক সুপরিচিত জাভাস্ক্রিপ্ট লাইব্রেরি ধরে সংগ্রহের উপর iterating নিজস্ব পদ্ধতি প্রদান অর্থাত অ্যারে , বস্তু , এবং বস্তু অ্যারের মত । এই পদ্ধতিগুলি ব্যবহার করতে সুবিধাজনক এবং যে কোনও ব্রাউজারের সাথে সম্পূর্ণ সুসংগত।

  1. আপনি যদি jQuery নিয়ে কাজ করেন তবে আপনি jQuery.each()পদ্ধতিটি ব্যবহার করতে পারেন । এটি উভয় বস্তু এবং অ্যারেতে বিরামহীনভাবে পুনরাবৃত্তি করতে ব্যবহৃত হতে পারে:

    $.each(obj, function(key, value) {
        console.log(key, value);
    });
  2. ইন Underscore.js আপনি পদ্ধতি জানতে পারেন _.each(), যা উপাদানের একটি তালিকা উপর iterates, একটি সরবরাহকৃত ফাংশন ঘুরে প্রতিটি ফলনশীল (ইন আর্গুমেন্ট অর্ডার বেতন মনোযোগ iteratee ফাংশন!):

    _.each(obj, function(value, key) {
        console.log(key, value);
    });
  3. লো-ড্যাশ বস্তুর বৈশিষ্ট্যগুলিকে পুনরাবৃত্তি করার জন্য বিভিন্ন পদ্ধতি সরবরাহ করে। বেসিক _.forEach()(বা এটির উপনাম _.each()) উভয় বস্তু এবং অ্যারে লুপিংয়ের জন্য দরকারী, তবে (!) lengthসম্পত্তি সম্বলিত বস্তুগুলিকে অ্যারের মতো ব্যবহার করা হয়, এবং এই আচরণটি এড়াতে এটি ব্যবহার করার পদ্ধতি _.forIn()এবং _.forOwn()পদ্ধতিগুলির পরামর্শ দেওয়া হয় (এগুলির মধ্যে valueপ্রথমে যুক্তিও রয়েছে):

    _.forIn(obj, function(value, key) {
        console.log(key, value);
    });

    _.forIn()ওভার iterates নিজের এবং উত্তরাধিকারসূত্রে একটি বস্তুর গণনীয় সম্পত্তি, যখন _.forOwn()iterates শুধুমাত্র উপর নিজের একটি বস্তুর বৈশিষ্ট্যাবলী (মূলত বিরুদ্ধে চেক hasOwnPropertyফাংশন)। সাধারণ অবজেক্ট এবং অবজেক্ট আক্ষরিক জন্য এই পদ্ধতিগুলির যে কোনও একটি ভাল কাজ করবে।

সাধারণত বর্ণিত সমস্ত পদ্ধতির কোনও সরবরাহিত বস্তুর সাথে একই আচরণ থাকে have নেটিভ for..inলুপ ব্যবহারের পাশাপাশি সাধারণত কোনও বিমূর্ততার চেয়ে দ্রুত হবে , যেমন jQuery.each(), এই পদ্ধতিগুলি ব্যবহার করা যথেষ্ট সহজ, কম কোডিং প্রয়োজন এবং ত্রুটি পরিচালনার জন্য আরও ভাল সরবরাহ করা হয়।


4
মানটি পেতে: ea .Ech (اعتراض, ফাংশন (কী, মান) {কনসোল.লগ (মান.টাইটেল);});
রবি রাম

2
আন্ডারস্কোর এবং
জ্যাকোয়ারি

52

ECMAScript 5 এ আপনার আক্ষরিক পুনরাবৃত্তি ক্ষেত্রে নতুন পদ্ধতি রয়েছে - Object.keys

আরও তথ্য আপনি MDN এ দেখতে পারেন

আমার পছন্দটি ব্রাউজারগুলির বর্তমান সংস্করণগুলিতে দ্রুত সমাধান হিসাবে নীচে রয়েছে (Chrome30, আই 10, এফএফ 25)

var keys = Object.keys(p),
    len = keys.length,
    i = 0,
    prop,
    value;
while (i < len) {
    prop = keys[i];
    value = p[prop];
    i += 1;
}

আপনি এই পদ্ধতির পারফরম্যান্স jsperf.com এ বিভিন্ন বাস্তবায়নের সাথে তুলনা করতে পারেন :

ব্রাউজার সমর্থন আপনি কঙ্গাক্সের কম্প্যাট টেবিলে দেখতে পারেন

পুরানো ব্রাউজারের জন্য আপনার কাছে সহজ এবং পূর্ণ পলিফিল রয়েছে

UPD:

এই প্রশ্নটিতে সবচেয়ে জনপ্রিয় ক্ষেত্রেগুলির জন্য পারফরম্যান্স তুলনা perfjs.info:

বস্তু আক্ষরিক পুনরাবৃত্তি


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

50

মুখবন্ধ:

  • অবজেক্টের বৈশিষ্ট্যগুলি নিজস্ব হতে পারে (সম্পত্তি নিজেই বস্তুর উপরে থাকে) বা উত্তরাধিকারসূত্রে প্রাপ্ত হয় (অবজেক্টটিতে নিজেই নয়, এর একটি প্রোটোটাইপগুলিতে)।
  • অবজেক্ট বৈশিষ্ট্যাবলী হতে পারে গণনীয় বা অ গণনীয় । অগণনীয় বৈশিষ্ট্যগুলি প্রচুর সম্পত্তি গণনা / অ্যারে বাদ পড়ে are
  • সম্পত্তির নামগুলি স্ট্রিং বা প্রতীক হতে পারে। যে সম্পত্তিগুলির নাম প্রতীক রয়েছে সেই সম্পত্তিগুলিতে প্রচুর সম্পত্তি গণনা / অ্যারে বাদ পড়ে of

এখানে 2018 এ, কোনও সামগ্রীর বৈশিষ্ট্যগুলির মধ্যে লুপিংয়ের জন্য আপনার বিকল্পগুলি (কয়েকটি উদাহরণ তালিকা অনুসরণ করে):

  1. for-in[ এমডিএন , স্পেস ] - একটি লুপ স্ট্রাকচার যা উত্তরাধিকার সূত্রে প্রাপ্ত ব্যক্তিবর্গের অন্তর্ভুক্ত, যার নামগুলি স্ট্রিং সহ কোনও বস্তুর অগণিত বৈশিষ্ট্যগুলির নামের মাধ্যমে লুপ করে structure
  2. Object.keys[ MDN , বৈশিষ্ট ] - একটি ফাংশন একটি বস্তু এর নাম একটি অ্যারের প্রদানের নিজের , গণনীয় বৈশিষ্ট্য যাদের নাম স্ট্রিং হয়।
  3. Object.values[ এমডিএন , স্পেস ] - একটি ফাংশন কোনও অবজেক্টের নিজস্ব , গণ্যমান্য বৈশিষ্ট্যের মানগুলির একটি অ্যারে সরবরাহ করে।
  4. Object.entries[ MDN , বৈশিষ্ট ] - নামের একটি অ্যারের প্রদানের একটি ফাংশন এবং একটি বস্তু এর মান নিজের , গণনীয় বৈশিষ্ট্যাবলী (অ্যারের মধ্যে প্রতিটি প্রবেশ একটি হল [name, value]অ্যারে)।
  5. Object.getOwnPropertyNames[ এমডিএন , স্পেস ] - একটি ফাংশন কোনও বস্তুর নিজস্ব বৈশিষ্ট্য (এমনকি অগণিতও নয়) এর নামগুলির স্ট্রিংয়ের নামের একটি অ্যারে সরবরাহ করে।
  6. Object.getOwnPropertySymbols[ এমডিএন , স্পেস ] - কোনও ফাংশন কোনও অবজেক্টের নিজস্ব বৈশিষ্ট্য (এমনকি অগণিতও নয়) যাদের নাম প্রতীক তাদের নামের একটি অ্যারে সরবরাহ করে ।
  7. Reflect.ownKeys[ এমডিএন , স্পেস ] - কোনও ফাংশন কোনও বস্তুর নিজস্ব বৈশিষ্ট্য (এমনকি অ-গণনাযোগ্যও নয়) এর নামের একটি অ্যারে সরবরাহ করে , সেই নামগুলি স্ট্রিং বা প্রতীক কিনা।
  8. আপনি যদি চান সব অ গণনীয় উত্তরাধিকারসূত্রে বেশী সহ একটি বস্তু এর সম্পত্তি,, আপনি একটি লুপ এবং ব্যবহার করতে হবে Object.getPrototypeOf[ MDN , বৈশিষ্ট ] এবং ব্যবহার Object.getOwnPropertyNames, Object.getOwnPropertySymbolsঅথবা Reflect.ownKeys(এই উত্তর নীচে উদাহরণ) প্রোটোটাইপ শৃঙ্খল প্রতিটি বস্তুর উপর।

সঙ্গে তাদের সব ছাড়া for-in, আপনি শৃঙ্খলার কনস্ট্রাক্ট লুপিং (কোন ধরণের ব্যবহার করতে চাই for, for-of, forEach, ইত্যাদি)।

উদাহরণ:

for-in:

Object.keys (একটি for-ofলুপ সহ, তবে আপনি যে কোনও লুপিং নির্মাণ ব্যবহার করতে পারেন) :

Object.values:

Object.entries:

Object.getOwnPropertyNames:

Object.getOwnPropertySymbols:

Reflect.ownKeys:

উত্তরাধিকারসূত্রে অ-গণনাযোগ্য সমস্তগুলি সহ সমস্ত সম্পত্তি :


গণনাযোগ্য / অ-গুণযোগ্য অবজেক্টের বৈশিষ্ট্যের দুর্দান্ত সংযোজন।
সেরোসায়েস

49

আপনি কেবল এটির উপর পুনরাবৃত্তি করতে পারেন:

for (var key in p) {
  alert(p[key]);
}

দ্রষ্টব্য যে keyসম্পত্তিটির মান গ্রহণ করবে না, এটি কেবলমাত্র একটি সূচক মান।


13
এটি পুনরাবৃত্তি এবং এমনকি সম্পূর্ণ সঠিক নয়। এই কাজটি সঠিকভাবে করার জন্য আপনার কাছে প্রসত্তির একটি চেক থাকা দরকার
ভাতসাল

4
আমি প্রথমে উপরের মন্তব্যের উপর ভিত্তি করে এটিকে অবনমিত করেছিলাম যতক্ষণ না আমি বুঝতে পারি যে এই উত্তরটি প্রথম এসেছে, সুতরাং "পুনরাবৃত্তি" হয় না। এটি সম্ভবত অসম্পূর্ণ তবে এটি বেশ কয়েকটি ক্ষেত্রে ঠিক কাজ করে।
বিলেণোহ

27

যেহেতু es2015 আরও বেশি জনপ্রিয় হচ্ছে আমি এই উত্তরটি পোস্ট করছি যা [key, value]জোড়ায় সহজেই পুনরুক্তি করতে জেনারেটর এবং পুনরুক্তি ব্যবহারের অন্তর্ভুক্ত । যেমন অন্য ভাষাতে যেমন রুবি সম্ভব।

ঠিক আছে এখানে একটি কোড:

const MyObject = {
  'a': 'Hello',
  'b': 'it\'s',
  'c': 'me',
  'd': 'you',
  'e': 'looking',
  'f': 'for',
  [Symbol.iterator]: function* () {
    for (const i of Object.keys(this)) {
      yield [i, this[i]];
    }
  }
};

for (const [k, v] of MyObject) {
  console.log(`Here is key ${k} and here is value ${v}`);
}

আপনি কীভাবে একজন পুনরুক্তি প্রদানকারী এবং জেনারেটর করতে পারেন সে সম্পর্কে সমস্ত তথ্য আপনি বিকাশকারী মজিলা পৃষ্ঠায় খুঁজে পেতে পারেন।

আশা করি এটি কাউকে সাহায্য করেছে।

সম্পাদনা করুন:

ES2017 এর মধ্যে অন্তর্ভুক্ত থাকবে Object.entriesযা বস্তুগুলিতে জোড়গুলির চেয়ে [key, value]আরও সহজ করে তুলবে। এটি এখন জানা গেছে যে এটি টিএস 39 অনুসারে কোনও মানের অংশ হবে স্টেজের তথ্য ।

আমি মনে করি এটি এখনকার চেয়ে আরও সুদৃ .় হয়ে উঠতে আমার উত্তর আপডেট করার সময় এসেছে।

const MyObject = {
  'a': 'Hello',
  'b': 'it\'s',
  'c': 'me',
  'd': 'you',
  'e': 'looking',
  'f': 'for',
};

for (const [k, v] of Object.entries(MyObject)) {
  console.log(`Here is key ${k} and here is value ${v}`);
}

আপনি MDN পৃষ্ঠায় ব্যবহার সম্পর্কে আরও জানতে পারেন


এটি আমার কাছে একেবারে অতিরিক্তহীন / অপ্রয়োজনীয় দেখায়। আপনি কি এটি আপনার সিস্টেমের প্রতিটি বস্তুর সাথে যুক্ত করবেন? আমি ভেবেছিলাম একটি পুনরুক্তি প্রদানের বিন্দুটি যাতে আপনি করতে পারেন তবে (মাইবজেক্টের কনস্ট [কে, ভি]) '। এটি কেবল অতিরিক্ত কোডের মতো সামান্য অতিরিক্ত মান সরবরাহ করে বলে মনে হচ্ছে।
ডিন র‌্যাডক্লিফ

22
for(key in p) {
  alert( p[key] );
}

দ্রষ্টব্য: আপনি অ্যারেতে এটি করতে পারেন তবে আপনি lengthএবং অন্যান্য বৈশিষ্ট্যগুলিও পুনরাবৃত্তি করতে পারেন।


4
এর মতো লুপের জন্য ব্যবহার করার সময়, keyকেবল একটি সূচকের মানটি গ্রহণ করা হবে, যাতে এটি 0, 1, 2 ইত্যাদি সজাগ করবে ... আপনার পি [কী] অ্যাক্সেস করতে হবে।
ব্রায়ান

1
এটি জাভাস্ক্রিপ্টে অ্যারে পুনরাবৃত্তির সবচেয়ে ধীরতম পদ্ধতি। আপনি এটি আপনার কম্পিউটারে পরীক্ষা করতে পারেন - জাভাস্ক্রিপ্টে অ্যারেগুলি দিয়ে পুনরাবৃত্তি করার সর্বোত্তম উপায়
পেনক্রফ

5
@ পেনক্রফ: সমস্যাটি হচ্ছে প্রশ্নটি অ্যারে দিয়ে লুপিং সম্পর্কে নয় ...;)
Sk8erPeter

এটি স্ট্যাকওভারফ্লোতে আমি বুঝতে পারি না। রিচার্ড সঠিক উত্তরটি দিয়েছিল, এবং সেই উত্তরটি তিনিই প্রথম দিয়েছেন, কিন্তু তিনি কোনও +1 পাননি? @ ব্রায়ান var p = {"p1":"q","p2":"w"}; for(key in p) { alert( key ); }সতর্কতাগুলিতে "পি 1" এবং "পি 2" পপ করছে, তবে এ সম্পর্কে কী ভুল ???
সেবাস্তিয়ান

5
আমি মনে করি মূল পার্থক্যটি হ'ল গুণ: অন্যান্য উত্তরগুলি কেবল কীভাবে তা নয়, তা সতর্ক করে (যেমন, প্রোটোটাইপ) এবং কীভাবে এই ক্যাভেটগুলি মোকাবেলা করতে হয় তাও বলে। এই প্রোগ্রামটিতে, যারা অন্যান্য উত্তর হয় খনি বেশী ভালো :)।
রিচার্ড লেভাসিউর

20

এখানে সমস্ত উত্তর সন্ধানের পরে, আমার নিজস্ব ব্যবহারের জন্য hasnwnProperty এর প্রয়োজন নেই কারণ আমার জেসন বস্তুটি পরিষ্কার; অতিরিক্ত কোনও জাভাস্ক্রিপ্ট প্রসেসিং যুক্ত করার আসলেই কোনও বুদ্ধি নেই। এই আমি ব্যবহার করছি:

for (var key in p) {
    console.log(key + ' => ' + p[key]);
    // key is key
    // value is p[key]
}

18
JSON অবজেক্টটি পরিষ্কার কিনা তা অপ্রাসঙ্গিক। অন্য কোনও সময়ে যদি কোনও কোড কোনও সম্পত্তি সেট করে Object.prototype, তবে তা দ্বারা গণনা করা হবে for..in। আপনি যদি নিশ্চিত হন যে আপনি যে কোনও লাইব্রেরি ব্যবহার করেন না তবে আপনার কল করার দরকার নেই hasOwnProperty
জি-উইজ

4
এটি সম্পূর্ণরূপে পরিষ্কার করা যায়Object.create(null)
জুয়ান মেন্ডেস

20

ফোরএচ () সহ প্রোটোটাইপের মাধ্যমে যা প্রোটোটাইপ চেইন বৈশিষ্ট্যগুলি এড়ানো উচিত :

Object.prototype.each = function(f) {
    var obj = this
    Object.keys(obj).forEach( function(key) { 
        f( key , obj[key] ) 
    });
}


//print all keys and values
var obj = {a:1,b:2,c:3}
obj.each(function(key,value) { console.log(key + " " + value) });
// a 1
// b 2
// c 3

2
প্রোটোটাইপ সঙ্গে সতর্ক থাকুন: obj = { print: 1, each: 2, word: 3 }উত্পাদন করে TypeError: number is not a functionforEachঅনুরূপ Arrayফাংশনটি মেলাতে ব্যবহার করা কিছুটা ঝুঁকি হ্রাস করতে পারে।
ডেভিড হার্কনেস

18

এই উত্তরগুলির মধ্যে আকর্ষণীয় লোকেরা উভয়ই স্পর্শ করেছে Object.keys()এবং for...ofসেগুলি কখনও সংযুক্ত হয়নি:

var map = {well:'hello', there:'!'};
for (let key of Object.keys(map))
    console.log(key + ':' + map[key]);

তুমি শুধু যা করতে পারেন for...ofএকটি Objectকারণ এটি একটি পুনরুক্তিকারীর না, এবং for...indexবা .forEach()ing Object.keys()কুশ্রী / অদক্ষ হয়।
আমি আনন্দিত যে বেশিরভাগ লোকেরা for...in(চেকিং সহ বা চেক না করে .hasOwnProperty()) এড়িয়ে চলেন কারণ এটিও কিছুটা অগোছালো, সুতরাং উপরের আমার উত্তর ছাড়া অন্য, আমি এখানে বলার জন্য ...


আপনি সাধারণ অবজেক্ট অ্যাসোসিয়েশনগুলি পুনরাবৃত্তি করতে পারেন! শুধু মত ব্যবহার Mapঅভিনব সরাসরি ব্যবহার সঙ্গে গুলি for...of
ডেমো Chrome এবং মুক্তিযোদ্ধা ওয়ার্কিং (আমি ES6 অনুমান শুধুমাত্র)

var ordinaryObject = {well:'hello', there:'!'};
for (let pair of ordinaryObject)
    //key:value
    console.log(pair[0] + ':' + pair[1]);

//or
for (let [key, value] of ordinaryObject)
    console.log(key + ':' + value);

যতক্ষণ না আপনি আমার শিমটি নীচে অন্তর্ভুক্ত করবেন:

//makes all objects iterable just like Maps!!! YAY
//iterates over Object.keys() (which already ignores prototype chain for us)
Object.prototype[Symbol.iterator] = function() {
    var keys = Object.keys(this)[Symbol.iterator]();
    var obj = this;
    var output;
    return {next:function() {
        if (!(output = keys.next()).done)
            output.value = [output.value, obj[output.value]];
        return output;
    }};
};

একটি সত্যিকারের মানচিত্র অবজেক্ট তৈরি না করেই এতে সুন্দর সিনট্যাকটিক চিনি নেই।

var trueMap = new Map([['well', 'hello'], ['there', '!']]);
for (let pair of trueMap)
    console.log(pair[0] + ':' + pair[1]);

প্রকৃতপক্ষে, এই শিমের সাথে, আপনি যদি এখনও মানচিত্রের অন্যান্য কার্যকারিতাটির সুবিধা নিতে চান (সেগুলিতে সমস্ত ঝাঁকুনি না দিয়ে) তবে এখনও ঝরঝরে অবজেক্ট স্বরলিপিটি ব্যবহার করতে চান, যেহেতু অবজেক্টগুলি এখন পুনরাবৃত্তিযোগ্য আপনি এখন কেবল এটি থেকে একটি মানচিত্র তৈরি করতে পারেন!

//shown in demo
var realMap = new Map({well:'hello', there:'!'});

যাঁরা ঝাঁকুনি পছন্দ করেন না বা prototypeসাধারণভাবে জগাখিচুড়ি করেন না, তারা এটিকে তার মতো কিছু বলার পরিবর্তে উইন্ডোতে ফাংশনটি নির্দ্বিধায় বোধ করেন getObjIterator();

//no prototype manipulation
function getObjIterator(obj) {
    //create a dummy object instead of adding functionality to all objects
    var iterator = new Object();

    //give it what the shim does but as its own local property
    iterator[Symbol.iterator] = function() {
        var keys = Object.keys(obj)[Symbol.iterator]();
        var output;

        return {next:function() {
            if (!(output = keys.next()).done)
                output.value = [output.value, obj[output.value]];
            return output;
        }};
    };

    return iterator;
}

এখন আপনি এটিকে কেবল একটি সাধারণ ফাংশন হিসাবে কল করতে পারেন, অন্য কোনও কিছুই প্রভাবিত হয় না

var realMap = new Map(getObjIterator({well:'hello', there:'!'}))

অথবা

for (let pair of getObjIterator(ordinaryObject))

এটি কাজ করবে না তার কোনও কারণ নেই।

ভবিষ্যতে আপনাকে স্বাগতম।


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

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

@ জানুস ট্রিলসন আপনি কি পুরো উত্তরটি পড়েছেন? For those who don't like to shim, or mess with prototype in general, feel free to make the function on window instead, calling it something like getObjIterator() then;
হ্যাশব্রাউন

মনে রাখবেন যে এই কৌশলটি প্লেইন অবজেক্টগুলিতে কাজ করে না, তবে তা কার্যকর।
noɥʇʎԀʎzɐɹƆ

এটি প্লেইন অবজেক্টগুলির জন্য কাজ করে, এটি আক্ষরিকভাবে পুরো পয়েন্ট (সেইসাথে চলক নামগুলি ordinaryObjectজোর দেওয়ার মতো যা জাদু এখনও সেই ধরণের জন্য কাজ করে)। আপনি কি গণতন্ত্রগুলি পরীক্ষা করেছেন; আপনার জন্য কি কাজ করছে না, @ noɥʇʎԀʎzɐɹƆ? (পিএস আপনার এসই প্রোফাইল চিত্র মনিব)
হ্যাশব্রাউন

13

অবজেক্ট.কিজ (আপত্তি): অ্যারে

সমস্ত গণ্য নিজস্ব (অ-উত্তরাধিকারসূত্রে) বৈশিষ্ট্যের সমস্ত স্ট্রিং-মূল্যবান কীগুলি পুনরুদ্ধার করে।

সুতরাং হ্যাশঅনপ্রপার্টি দিয়ে প্রতিটি বস্তু কীটি পরীক্ষা করে আপনি যেমন চান তেমন তালিকা সরবরাহ করে। আপনার অতিরিক্ত টেস্ট অপারেশনটির দরকার নেই এবং Object.keys( obj ).forEach(function( key ){})এটির দ্রুত হওয়া উচিত। আসুন এটি প্রমাণ করুন:

var uniqid = function(){
			var text = "",
					i = 0,
					possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
			for( ; i < 32; i++ ) {
					text += possible.charAt( Math.floor( Math.random() * possible.length ) );
			}
			return text;
		}, 
		CYCLES = 100000,
		obj = {}, 
		p1,
		p2,
		p3,
		key;

// Populate object with random properties
Array.apply( null, Array( CYCLES ) ).forEach(function(){
	obj[ uniqid() ] = new Date()
});

// Approach #1
p1 = performance.now();
Object.keys( obj ).forEach(function( key ){
	var waste = obj[ key ];
});

p2 = performance.now();
console.log( "Object.keys approach took " + (p2 - p1) + " milliseconds.");

// Approach #2
for( key in obj ) {
	if ( obj.hasOwnProperty( key ) ) {
		var waste = obj[ key ];
	}
}

p3 = performance.now();
console.log( "for...in/hasOwnProperty approach took " + (p3 - p2) + " milliseconds.");

আমার ফায়ারফক্সে আমি নিম্নলিখিত ফলাফল পেয়েছি

  • অবজেক্ট.কিজ অ্যাপ্রোচটি 40.21101451665163 মিলিসেকেন্ডে নিয়েছে।
  • ... এর মধ্যে / hasOwnProperty পদ্ধতির 98.26163508463651 মিলি সেকেন্ড নিয়েছে।

পুনশ্চ. Chrome এ পার্থক্যটি আরও বড় http://codepen.io/dsheiko/pen/JdrqXa

PS2: ES6 এ (একমাস্ক্রিপ্ট 2015) আপনি পুনরাবৃত্তিযোগ্য অবজেক্টের ভাল পুনরাবৃত্তি করতে পারেন:

let map = new Map().set('a', 1).set('b', 2);
for (let pair of map) {
    console.log(pair);
}

// OR 
let map = new Map([
    [false, 'no'],
    [true,  'yes'],
]);
map.forEach((value, key) => {
    console.log(key, value);
});


আপনি যদি}} স্বরলিপিটি ছেড়ে যেতে চান না, তবে আপনি এখনও ব্যবহার করতে পারেন of তৈরি ছাড়া Mapগুলি
Hashbrown

13

কোনও বস্তুর মাধ্যমে পুনরাবৃত্তি করার জন্য এখানে আরও একটি পদ্ধতি।

   var p = {
"p1": "value1",
"p2": "value2",
"p3": "value3"
};


Object.keys(p).forEach(key => { console.log(key, p[key]) })


3
এটি বেশ দুর্দান্ত, তবে বড় আকারের সামগ্রীর জন্য, forপদ্ধতিটি আরও পারফরম্যান্ট হতে পারে।
রলফ


12

আপনি অবজেক্ট.কিজ () ব্যবহার করতে পারেন এবং মান পেতে নীচের মতো অবজেক্ট কীগুলির মাধ্যমে পুনরাবৃত্তি করতে পারেন:

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

Object.keys(p).forEach((key)=> {
 console.log(key +' -> '+ p[key]);
});


আপনি আমার সময় বাঁচিয়েছেন, আপনাকে ধন্যবাদ
অদলবদল-আইওএস-অ্যান্ড্রয়েড

জেনে খুশি :)
ওয়ানরা

8

নির্ভরতা ছাড়াই কেবল জাভাস্ক্রিপ্ট কোড:

var p = {"p1": "value1", "p2": "value2", "p3": "value3"};
keys = Object.keys(p);   // ["p1", "p2", "p3"]

for(i = 0; i < keys.length; i++){
  console.log(keys[i] + "=" + p[keys[i]]);   // p1=value1, p2=value2, p3=value3
}

8

Object.keys()পদ্ধতি একটি প্রদত্ত বস্তু নিজস্ব গণনীয় বৈশিষ্ট্য একটি বিন্যাস দেখায়। এটি সম্পর্কে এখানে আরও পড়ুন

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

Object.keys(p).map((key)=> console.log(key + "->" + p[key]))


8

কর্মক্ষমতা

আজ 2020.03.06 আমি ম্যাকওস হাই সিয়েরা ভি 10.13.6 এ ক্রোম ভি 80.0, সাফারি ভি 13.0.5 এবং ফায়ারফক্স 73.0.1 এ নির্বাচিত সমাধানগুলির পরীক্ষা করে নিই

উপসংহার

  • for-in(এ, বি) ভিত্তিক সমাধানগুলি বড় এবং ছোট বস্তুর জন্য সমস্ত ব্রাউজারের জন্য দ্রুত (বা দ্রুত))
  • আশ্চর্যজনকভাবে for-of(এইচ) দ্রবণটি ছোট এবং বড় অবজেক্টগুলির জন্য ক্রোমের উপর দ্রুত
  • সুস্পষ্ট সূচক উপর ভিত্তি করে সমাধান i (জে, কে) ছোট ছোট বস্তুর জন্য সমস্ত ব্রাউজারগুলিতে বেশ দ্রুত (ফায়ারফক্সের জন্য বড় ওজবেক্টের জন্য দ্রুত তবে অন্যান্য ব্রাউজারগুলিতে মাঝারি দ্রুত)
  • পুনরাবৃত্তকারী (ডি, ই) এর উপর ভিত্তি করে সমাধানগুলি সবচেয়ে ধীর এবং প্রস্তাবিত নয়
  • সমাধান সি বড় অবজেক্টগুলির জন্য ধীর এবং ছোট বস্তুর জন্য মাঝারি ধীর

এখানে চিত্র বর্ণনা লিখুন

বিস্তারিত

পারফরম্যান্স পরীক্ষার জন্য সম্পাদিত হয়েছিল

  • ছোট অবজেক্ট - 3 টি ক্ষেত্র সহ - আপনি আপনার মেশিনে পরীক্ষা করতে পারেন এখানে
  • 'বড়' অবজেক্ট - 1000 ক্ষেত্র সহ - আপনি এখানে আপনার মেশিনে পরীক্ষা করতে পারেন

নীচে স্নিপেটগুলি ব্যবহৃত সমাধানগুলি উপস্থাপন করে

এবং ক্রোমে ছোট ছোট বস্তুর জন্য ফলাফল

এখানে চিত্র বর্ণনা লিখুন


7

আপনি সমস্ত বস্তুতে প্রতিটি সাধারণ ফাংশন যুক্ত করতে পারেন, যাতে আপনি যে কোনও বস্তুর মাধ্যমে স্বয়ংক্রিয়ভাবে লুপ করতে পারেন:

Object.defineProperty(Object.prototype, 'forEach', {
    value: function (func) {
        for (var key in this) {
            if (!this.hasOwnProperty(key)) {
                // skip loop if the property is from prototype
                continue;
            }
            var value = this[key];
            func(key, value);
        }
    },
    enumerable: false
});

সেই লোকদের জন্য যারা " জন্য ... ইন " -ধর্মী: পছন্দ করেন না

Object.defineProperty(Object.prototype, 'forEach', {
    value: function (func) {
        var arr = Object.keys(this);
        for (var i = 0; i < arr.length; i++) {
            var key = arr[i];
            func(key, this[key]);
        }
    },
    enumerable: false
});

এখন, আপনি সহজ কল করতে পারেন:

p.forEach (function(key, value){
    console.log ("Key: " + key);
    console.log ("Value: " + value);
});

আপনি যদি প্রতিটি ফর-মেথডের সাথে দ্বন্দ্ব পেতে না চান তবে আপনি নিজের অনন্য নামের সাথে এটির নাম রাখতে পারেন।


3
অবজেক্টে নির্মিত (যেমন Object) এর প্রোটোটাইপগুলি পরিবর্তন করা সাধারণত একটি বিরোধী প্যাটার্ন হিসাবে বিবেচিত হয় কারণ এটি সহজেই অন্যান্য কোডের সাথে দ্বন্দ্ব সৃষ্টি করতে পারে। সুতরাং ক্ষত না এই ভাবে করছেন সুপারিশ।
মরটিজ

6

খাঁটি জাভাস্ক্রিপ্ট ব্যবহার করার সময় লুপগুলি বেশ আকর্ষণীয় হতে পারে। দেখে মনে হচ্ছে যে কেবল ইসিএমএ 6 (নতুন 2015 জাভাস্ক্রিপ্ট স্পেসিফিকেশন) নিয়ন্ত্রণের আওতায় এসেছে। দুর্ভাগ্যক্রমে আমি এটি লিখছি হিসাবে, ব্রাউজার এবং জনপ্রিয় ইন্টিগ্রেটেড বিকাশ পরিবেশ (আইডিই) এখনও সম্পূর্ণ নতুন ঘণ্টা এবং হুইসেল সমর্থন করার জন্য সংগ্রাম করে যাচ্ছেন।

ECMA6 এর আগে একটি জাভাস্ক্রিপ্ট অবজেক্ট লুপটি দেখতে কেমন তা এখানে এক নজরে দেখুন:

for (var key in object) {
  if (p.hasOwnProperty(key)) {
    var value = object[key];
    console.log(key); // This is the key;
    console.log(value); // This is the value;
  }
}

এছাড়াও, আমি জানি যে এটি এই প্রশ্নের বাইরে নয় তবে ২০১১ সালে, ইসমাস্ক্রিপ্ট ৫.১ forEachকেবল অ্যারেগুলির জন্য একটি পদ্ধতি যুক্ত করেছিল যা মূলত অ্যারেগুলির মাধ্যমে লুপের জন্য একটি নতুন উন্নততর উপায় তৈরি করেছিল যখন এখনও পুরানো ভার্বোস এবং বিভ্রান্তিকর forলুপের সাথে অ পুনরাবৃত্ত বস্তুগুলি রেখে যায় leaving তবে অদ্ভুত অংশটি হ'ল এই নতুন forEachপদ্ধতিটি সমর্থন করে না breakযা সকল ধরণের অন্যান্য সমস্যা তৈরি করেছিল।

মূলত ২০১১ সালে, অনেক জনপ্রিয় লাইব্রেরি (jQuery, অ্যান্ডস্কোর ইত্যাদি) পুনঃ-প্রয়োগের সিদ্ধান্ত নিয়েছে এমনটি ছাড়া জাভাস্ক্রিপ্টে লুপ করার সত্যিকারের শক্ত উপায় নেই।

২০১৫ সালের হিসাবে, আমাদের কাছে এখন কোনও ধরণের ধরণের (অ্যারে এবং স্ট্রিং সহ) লুপ করার (এবং ব্রেক) বাক্সের উপায়ের থেকে ভাল। সুপারিশটি মূলধারার হয়ে উঠলে জাভাস্ক্রিপ্টের লুপটি শেষ পর্যন্ত কেমন দেখাবে তা এখানে:

for (let [key, value] of Object.entries(object)) {
    console.log(key); // This is the key;
    console.log(value); // This is the value;
}

নোট করুন যে বেশিরভাগ ব্রাউজারগুলি উপরের কোডটি 18 জুন, 2016 পর্যন্ত সমর্থন করবে না Even এমনকি ক্রোমেও আপনাকে এটি কাজ করার জন্য এই বিশেষ পতাকাটি সক্ষম করতে হবে: chrome://flags/#enable-javascript-harmony

এটি নতুন স্ট্যান্ডার্ড না হওয়া পর্যন্ত পুরাতন পদ্ধতিটি এখনও ব্যবহার করা যেতে পারে তবে জনপ্রিয় লাইব্রেরিতে বা এমনকি হালকা ওজনের বিকল্পগুলির মধ্যে যারা এই লাইব্রেরির কোনও ব্যবহার করছেন না তাদের জন্য বিকল্প রয়েছে


আপনি কি এই কাজের একটি মাপসই সরবরাহ করতে পারেন? আমার চেষ্টা এখানে। jsfiddle.net/abalter/sceeb211
অ্যাবাল্টার

@ বা্যাল্টার দুঃখিত আমি বুঝতে পারি আমার কোডটিতে আমার একটি টাইপ আছে। আমি এটি ঠিক করেছি এবং আপনার জেএসফিডেলটি এখানে আপডেট করেছি: jsfiddle.net/sceeb211/2
নিকোলাস বোভ্রেট

আমি ক্রোমে আছি এবং পাচ্ছি Uncaught TypeError: Object.entries is not a function। এটি এখনও ক্রোমে প্রয়োগ করা হয়নি?
আবাল্টার

@ বা্যাল্টার এটি আপনার ক্রোম সংস্করণ 51 রয়েছে এবং আমার সম্পাদনা এবং জেএসফিডাল মন্তব্যে বর্ণিত হিসাবে আপনি পতাকাটি সক্ষম করেছেন তা নিশ্চিত করুন। আপনি এখানে বিশদটি পরীক্ষা করতে পারেন: বিকাশকারী.মোজিলা.আর.ইন-
ইউএস / ডকস / ওয়েব / জাভা স্ক্রিপ্ট / রেফারেন্স /

দুঃখিত আমি পতাকা সম্পর্কে মিস করেছি। আমি দেখতে পাই এটি এখনও সম্পূর্ণরূপে বাস্তবায়িত বৈশিষ্ট্য নয়।
আবাল্টার

5

ES6- এ আমাদের পূর্ববর্তী কিছু অভ্যন্তরীণ পদ্ধতি প্রকাশ করার জন্য সুপরিচিত প্রতীক রয়েছে, আপনি এই বস্তুর জন্য পুনরাবৃত্তিগুলি কীভাবে কাজ করে তা নির্ধারণ করতে আপনি এটি ব্যবহার করতে পারেন:

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3",
    *[Symbol.iterator]() {
        yield *Object.keys(this);
    }
};

[...p] //["p1", "p2", "p3"]

এটি এস 6 লুপে ... এর জন্য ব্যবহারের মতো একই ফলাফল দেবে।

for(var key in p) {
    console.log(key);
}

তবে আপনার এখন এস have ব্যবহার করে যে দক্ষতা রয়েছে তা জানা গুরুত্বপূর্ণ!


1
একটি কাস্টম অবজেক্ট পুনরাবৃত্তকারী একটি অ্যারের বিল্ট-ইন অ্যারে পুনরুক্তিকারীকে কল করে যা Object.keys()মেমোরিতে উত্পন্ন এবং বরাদ্দ ... শীতল!
ooo

5

আমি obj.hasOwnerPropertyপ্রতিটি for ... inলুপের মধ্যে পরীক্ষা করার চেয়ে এটি করব would

var obj = {a : 1};
for(var key in obj){
    //obj.hasOwnProperty(key) is not needed.
    console.log(key);
}
//then check if anybody has messed the native object. Put this code at the end of the page.
for(var key in Object){
    throw new Error("Please don't extend the native object");
}

5

    var p =[{"username":"ordermanageadmin","user_id":"2","resource_id":"Magento_Sales::actions"},
{"username":"ordermanageadmin_1","user_id":"3","resource_id":"Magento_Sales::actions"}]
for(var value in p) {
    for (var key in value) {
        if (p.hasOwnProperty(key)) {
            console.log(key + " -> " + p[key]);
        }
    }
}


json = [{"key1":"value1","key2":"value2"},{"key1":"value3","key2":"value4"}] for (var i = 0; i < json.length; i++) { for (var key in json[i]) { if (json[i].hasOwnProperty(key)) { console.log(key + " -> " + json[i][key]); } } }
মারেক বার্নয়েড


4

আপনি যদি অ-গণনাযোগ্য বৈশিষ্ট্যগুলিতেও পুনরাবৃত্তি করতে চান , তবে আপনি Object.getOwnPropertyNames(obj)কোনও প্রদত্ত বস্তুর উপরে পাওয়া সমস্ত বৈশিষ্ট্যের (গণনাযোগ্য বা না) একটি অ্যারে ফিরে ব্যবহার করতে পারেন।

var obj = Object.create({}, {
  // non-enumerable property
  getFoo: {
    value: function() { return this.foo; },
    enumerable: false
  }
});

obj.foo = 1; // enumerable property

Object.getOwnPropertyNames(obj).forEach(function (name) {
  document.write(name + ': ' + obj[name] + '<br/>');
});


2
এটি দুর্দান্ত, এই উত্তরটি পোস্ট করার জন্য আপনাকে ধন্যবাদ। আমার কোনও Errorবস্তুর অন্তঃকরণের প্রয়োজন ছিল এবং লুপ বা _.forIn(err)কলটিতে বৈশিষ্ট্যগুলি পেতে পারি না । ব্যবহার করা Object.getOwnPropertyNames(err)আমাকে এক্সেস করার অনুমতি দেওয়া সব অংশগুলি Errorযে আমি আগে এ পাই নি। ধন্যবাদ!
পিয়ার্স

4

যদি কারও শর্তযুক্ত অ্যারেঅবজেক্টগুলির মাধ্যমে লুপ করা প্রয়োজন :

var arrayObjects = [{"building":"A", "status":"good"},{"building":"B","status":"horrible"}];

for (var i=0; i< arrayObjects.length; i++) {
  console.log(arrayObjects[i]);
  
  for(key in arrayObjects[i]) {      
    
      if (key == "status" && arrayObjects[i][key] == "good") {
        
          console.log(key + "->" + arrayObjects[i][key]);
      }else{
          console.log("nothing found");
      }
   }
}


4

ES6 বিবেচনা করে আমি আমার নিজস্ব চামচ চিনি যুক্ত করতে এবং অবজেক্টের বৈশিষ্ট্যগুলি পুনরুক্ত করার জন্য আরও একটি পদ্ধতির সরবরাহ করতে চাই।

যেহেতু সরল জেএস বস্তুটি কেবল বাক্সের বাইরেই পুনরাবৃত্তিযোগ্য নয় , তাই আমরা এর for..ofসামগ্রীতে পুনরাবৃত্তি করার জন্য লুপটি ব্যবহার করতে পারছি না । তবে এটিকে পুনরাবৃত্ত করার জন্য কেউ আমাদের থামাতে পারে না

আসুন আমরা bookআপত্তি আছে।

let book = {
  title: "Amazing book",
  author: "Me",
  pages: 3
}

book[Symbol.iterator] = function(){

  let properties = Object.keys(this); // returns an array with property names
  let counter = 0;
  let isDone = false;

  let next = () => {
    if(counter >= properties.length){
      isDone = true;
    }
    return { done: isDone, value: this[properties[counter++]] }
  }

  return { next };
}

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

for(let pValue of book){
  console.log(pValue);
}
------------------------
Amazing book
Me
3

অথবা আপনি যদি ES6 জেনারেটরের শক্তি জানেন তবে আপনি অবশ্যই কোডটিকে আরও খাটো করে তুলতে পারেন।

book[Symbol.iterator] = function *(){

  let properties = Object.keys(this);
  for (let p of properties){
    yield this[p];
  }

}

অবশ্যই, আপনি স্তরে Objectপুনরাবৃত্তিযোগ্য তৈরির সাথে সমস্ত সামগ্রীর জন্য এই জাতীয় আচরণ প্রয়োগ করতে পারেন prototype

Object.prototype[Symbol.iterator] = function() {...}

এছাড়াও, পুনরাবৃত্ত প্রোটোকলের সাথে সম্মতিযুক্ত অবজেক্টগুলি নতুন ES2015 বৈশিষ্ট্য স্প্রেড অপারেটরের সাথে ব্যবহার করা যেতে পারে সুতরাং আমরা বস্তুর সম্পত্তি মানগুলি একটি অ্যারে হিসাবে পড়তে পারি।

let pValues = [...book];
console.log(pValues);
-------------------------
["Amazing book", "Me", 3]

অথবা আপনি ডেস্ট্রাকচারিং অ্যাসাইনমেন্ট ব্যবহার করতে পারেন :

let [title, , pages] = book; // notice that we can just skip unnecessary values
console.log(title);
console.log(pages);
------------------
Amazing book
3

আমি উপরে প্রদত্ত সমস্ত কোড সহ আপনি জেএসফিডেল চেক আউট করতে পারেন ।


আমি পেয়েছি কোডটি মানগুলি তৈরি করবে তবে কীগুলি ছাড়াই। কীগুলির সাহায্যে মানগুলি পুনরাবৃত্তি করা সম্ভব?
পিকা

হ্যা, তুমি পারো. কেবল "ফলন [কী, আপত্তি [কী]] ফিরিয়ে দিন;" আপনার জেনারেটর ফাংশন থেকে এবং তারপরে এটি নীচের মত ব্যবহার করুন "এর জন্য (কী [মান]] {}"
আরটিওম প্রানোভিচ

4

ES06 যেহেতু আপনি কোনও বস্তুর মান অ্যারে হিসাবে পেতে পারেন

let arrValues = Object.values( yourObject) ;

এটি বস্তুর মানগুলির একটি অ্যারে প্রদান করে এবং এটি প্রোটোটাইপ থেকে মানগুলি বের করে না !!

MDN ডকস অবজেক্ট.ভ্যালু ()

এবং কীগুলির জন্য (আমার আগে এখানে জবাব দেওয়া হয়েছে)

let arrKeys   = Object.keys(yourObject);

উত্তরগুলি এমন সমাধানের জন্য জিজ্ঞাসা করে যা কী এবং মান উভয়ই ফিরিয়ে দেয়।
শান লিন্ডো

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