সহযোগী অ্যারে অবজেক্টে জাভাস্ক্রিপ্ট ফোরচ লুপ


181

আমার জন্য প্রতিটি লুপ আমার জাভাস্ক্রিপ্ট সহযোগী অ্যারে অবজেক্টের উপর কেন পুনরুক্তি করছে না?

// defining an array
var array = [];

// assigning values to corresponding keys
array["Main"] = "Main page";
array["Guide"] = "Guide page";
array["Articles"] = "Articles page";
array["Forum"] = "Forum board";

// expected: loop over every item,
// yet it logs only "last" assigned value - "Forum"
for (var i = 0; i < array.length; i++) {
    console.log(array[i]);
}

সম্পাদনা: jQuery each()সহায়ক হতে পারে: https://api.jquery.com/jQuery.each/


1
আপনি একটি অ্যারে তৈরি করেন তবে এটি মানচিত্র হিসাবে ব্যবহার করুন। দেখে মনে হচ্ছে পরিবর্তে আপনি কোনও সরল বস্তু চান।
জন

4
associative arraysজেএস এর মতো জিনিস নেই : এটি হয় সরল অ্যারে বা কোনও অবজেক্ট। কিছুই অ-সংখ্যাসূচক বৈশিষ্ট্যগুলি যুক্ত করতে বাধা দেয় না Array, তবে এটি তা করে না associative- বিশেষত, lengthসম্পত্তি এই বৈশিষ্ট্যগুলিকে স্বয়ংক্রিয়ভাবে গণনা করবে না।
রায়না 77 ই

3
পুনরায়: জেএসে এসোসিয়েটিভ অ্যারেগুলির মতো কোনও জিনিস নেই। - অন্যভাবে শব্দযুক্ত: জাভাস্ক্রিপ্ট "সহযোগী অ্যারে" নামের পরিবর্তে "অবজেক্ট" নামটি ব্যবহার করে। তবে এর কোনও "। দৈর্ঘ্য" সম্পত্তি নেই।
জেসি চিশলম

উত্তর:


313

.lengthসম্পত্তি শুধুমাত্র সাংখ্যিক সূচী (চাবি) সঙ্গে বৈশিষ্ট্য ট্র্যাক। আপনি কীগুলির জন্য স্ট্রিং ব্যবহার করছেন।

তুমি এটি করতে পারো:

var arr_jq_TabContents = {}; // no need for an array

arr_jq_TabContents["Main"] = jq_TabContents_Main;
arr_jq_TabContents["Guide"] = jq_TabContents_Guide;
arr_jq_TabContents["Articles"] = jq_TabContents_Articles;
arr_jq_TabContents["Forum"] = jq_TabContents_Forum;

for (var key in arr_jq_TabContents) {
    console.log(arr_jq_TabContents[key]);
}

সুরক্ষিত থাকার জন্য, সম্পত্তিগুলির কোনওটিই উত্তরাধিকারের অপ্রত্যাশিত ফলাফল নয় তা নিশ্চিত করার জন্য এটির মতো লুপগুলিতে এটি একটি ভাল ধারণা:

for (var key in arr_jq_TabContents) {
  if (arr_jq_TabContents.hasOwnProperty(key))
    console.log(arr_jq_TabContents[key]);
}

সম্পাদনা করুন - Object.keys()ফাংশনটি আধুনিক ব্রাউজারগুলিতে এবং নোড ইত্যাদিতে উপলভ্য আছে সম্ভবত এটি এখন একটি ভাল ধারণা That এই ফাংশনটি একটি অ্যারের হিসাবে কোনও বস্তুর "নিজস্ব" কীগুলি ফিরিয়ে দেয়:

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

প্রদত্ত কলব্যাক ফাংশনটি .forEach()প্রতিটি কী সহ কল ​​করা হয় এবং অ্যারের মধ্যে কী এর সূচক দ্বারা ফিরে আসে Object.keys()। এটি অ্যারেও পেরিয়ে গেছে যার মাধ্যমে ফাংশনটি পুনরাবৃত্তি হয়, তবে সেই অ্যারেটি আমাদের পক্ষে সত্যিই কার্যকর নয়; আমরা আসল প্রয়োজন বস্তুর । নাম দ্বারা সরাসরি এটি অ্যাক্সেস করা যেতে পারে, তবে (আমার মতে) এটি স্পষ্টভাবে পাস করা একটু উত্তম, যা দ্বিতীয় যুক্তি .forEach()- মূল বস্তু - যা thisকলব্যাকের অভ্যন্তরে আবদ্ধ হবে তা পাস করে করা হয় । (সবেমাত্র এটি নীচে একটি মন্তব্যে লক্ষ করা গিয়েছিল।)


এই কি var arr_jq_TabContents = {};? আমার অর্থ {}
সিজমন টোদা

1
@ আলট্রা এটি একটি খালি বস্তু আক্ষরিক। এর কেবল অর্থ হল যে ভেরিয়েবলটি একটি নতুন খালি অবজেক্টের রেফারেন্স সহ আরম্ভ করা হয়।
পয়েন্টি

@ আল্ট্রা আপনার আরে উদাহরণের দরকার নেই কারণ সেই কোডটিতে আপনি এটি জাভাস্ক্রিপ্ট অ্যারের মতো ব্যবহার করছেন না। জাভাস্ক্রিপ্টে কিছু অন্যান্য ভাষার মতো "সহযোগী অ্যারে" নেই।
পয়েন্টি

1
বরাদ্দকরণ []এবং এর মধ্যে পার্থক্য কী {}? শুধুমাত্র বিভিন্ন প্রোটোটাইপ?
সুনডেড

8
HasOwnProperty ব্যবহার করার পরিবর্তে সমস্ত আধুনিক ওয়েব ব্রাউজারগুলিতে কোনও বস্তুর কীগুলি ব্যবহার করে পুনরাবৃত্তি করা সম্ভব হবে: Object.keys(arr_jq_TabContents).forEach( function(key) { ... } );
গ্রেগরি বেল

79

এটি খুব সহজ পদ্ধতির। সুবিধাটি হ'ল আপনি কীগুলিও পেতে পারেন:

for (var key in array) {
    var value = array[key];
    console.log(key, value);
}

ES6 এর জন্য:

array.forEach(value => {
  console.log(value)
})  

ES6 এর জন্য: (আপনি যদি মান, সূচক এবং অ্যারে নিজেই চান)

array.forEach((value, index, self) => {
  console.log(value, index, self)
})  

12
varযে স্কোপিংয়ের অস্তিত্ব নেই তার প্রস্তাব দেওয়া লুপগুলিতে ব্যবহার করবেন না । varলুপের সামনে বা লুপে ব্যবহার করুন let

2
@ অবধি, আপনি লুপগুলিতে কেন ব্যবহার করবেন না সে সম্পর্কে আরও ব্যাখ্যা করতে পারেন? আমি সি ++ / পিএইচপি ব্যাকগ্রাউন্ড থেকে এসেছি এবং আমি এটি বুঝতে পারি না। লুপটিতে স্কোপিংয়ের অস্তিত্ব রয়েছে তবে অস্থায়ী তাই আপনি কী বোঝাতে চাইছেন তা সম্পর্কে আমি নিশ্চিত নই।
ডেনিস

6
@ ডেনিস বেশিরভাগ ভাষায় একটি forলুপের একটি পরিবর্তনশীল ঘোষণা লুপের শরীরে সীমাবদ্ধ সুযোগ তৈরি করে for। তবে জাভাস্ক্রিপ্টে ঘোষিত একটি চলক varসর্বদা বিশ্বব্যাপী কার্যকর হয় এমনকি আপনি এটি কোনও forলুপে লিখেন । এখানে দেখুন: davidwalsh.name/for-and-against-let
ving ই

1
প্রতি মেমরি ফাঁস হয় না, তবে অবশ্যই "মেমরি স্প্লস" হয়। varজাভাস্ক্রিপ্টে লুপটি সম্পন্ন হওয়ার পরেও স্মৃতিতে পরিবর্তনশীল তৈরি করে।
আহ্নবিজক্যাড

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

6

ইতিমধ্যে কয়েকটি সরল উদাহরণ রয়েছে, তবে আমি কীভাবে আপনার প্রশ্নটি শব্দটি লিখেছি তা থেকে আপনি সম্ভবত কোনও পিএইচপি ব্যাকগ্রাউন্ড থেকে এসেছেন এবং আপনি জাভাস্ক্রিপ্টটি একইভাবে কাজ করার প্রত্যাশা করছেন - তা নয়। একটি পিএইচপি arrayজাভাস্ক্রিপ্ট থেকে খুব আলাদা Array

পিএইচপি-তে, একটি সহযোগী অ্যারে সংখ্যাসূচক-সূচিযুক্ত অ্যারে যা করতে পারে তার বেশিরভাগ array_*কাজ করতে পারে ( ফাংশনগুলি কাজ করে, আপনি count()এটি করতে পারেন ইত্যাদি) আপনি কেবল একটি অ্যারে তৈরি করেন এবং সংখ্যার পরিবর্তে স্ট্রিং-সূচকে নির্ধারণ শুরু করেন।

জাভাস্ক্রিপ্টে, সমস্ত কিছুই একটি বস্তু (আদিমগুলি বাদে: স্ট্রিং, সংখ্যাসূচক, বুলিয়ান) এবং অ্যারেগুলি এমন একটি নির্দিষ্ট প্রয়োগ যা আপনাকে সংখ্যার সূচকগুলি দেয়। যেকোনো কিছু একটি অ্যারের পর্যন্ত পিছিয়ে দেয় তার প্রভাব হবে length, এবং (এরে পদ্ধতি ব্যবহার করে বেশি iterated যাবে map, forEach, reduce, filter, find, ইত্যাদি) তবে কারণ সবকিছুই একটি বস্তু হয়, তাহলে আপনি সবসময় বিনা কেবল বরাদ্দ বৈশিষ্ট্য করছি, যে কোন কিছু যা আপনি করতে কারণ কোন বস্তু স্কয়ার-ব্র্যাকেট স্বরলিপিটি কোনও সম্পত্তি অ্যাক্সেসের সহজ উপায়, সুতরাং আপনার ক্ষেত্রে:

array['Main'] = 'Main Page';

আসলে এর সমতুল্য:

array.Main = 'Main Page';

আপনার বিবরণ থেকে আমার অনুমান যে আপনি একটি 'এসোসিয়েটিভ অ্যারে' চান তবে জাভাস্ক্রিপ্টের জন্য হ্যাশম্যাপ হিসাবে কোনও অবজেক্টটি ব্যবহার করার এটি একটি সাধারণ ঘটনা। এছাড়াও, আমি জানি এটি একটি উদাহরণ, তবে অর্থহীন নামগুলি এড়িয়ে চলুন যা কেবলমাত্র পরিবর্তনশীল প্রকার (উদাহরণস্বরূপ array) এবং এটিতে কী থাকতে হবে (উদাহরণস্বরূপ pages) এর ভিত্তিতে নাম বর্ণনা করে । সরল অবজেক্টগুলির পুনরাবৃত্তি করার অনেকগুলি ভাল সরাসরি উপায় নেই, তাই প্রায়শই আমরা প্রথমে Objectপদ্ধতিগুলি ব্যবহার করে প্রথমে অ্যারেতে পরিণত করব ( Object.keysএই ক্ষেত্রে - এছাড়াও রয়েছে entriesএবং valuesএখনই কিছু ব্রাউজারে যুক্ত হচ্ছে) যা আমরা লুপ করতে পারি।

// assigning values to corresponding keys
const pages = {
  Main: 'Main page',
  Guide: 'Guide page',
  Articles: 'Articles page',
  Forum: 'Forum board',
};

Object.keys(pages).forEach((page) => console.log(page));

4

arr_jq_TabContents[key] অ্যারেটিকে 0-সূচক ফর্ম হিসাবে দেখায়।


4

জেনেরিক অবজেক্ট টাইপ হিসাবে কোনও এসোসিয়েটিভ অ্যারে ব্যবহার করার একটি সহজ উপায়:

Object.prototype.forEach = function(cb){
   if(this instanceof Array) return this.forEach(cb);
   let self = this;
   Object.getOwnPropertyNames(this).forEach(
      (k)=>{ cb.call(self, self[k], k); }
   );
};

Object({a:1,b:2,c:3}).forEach((value, key)=>{ 
    console.log(`key/value pair: ${key}/${value}`);
});


4

যদি নোড.জেএস বা ব্রাউজার সমর্থন করে তবে Object.entries()এটি ব্যবহারের বিকল্প হিসাবে ব্যবহার করতে পারেন Object.keys()( https://stackoverflow.com/a/18804596/225291 ))

const h = {
  a: 1,
  b: 2
};

Object.entries(h).forEach(([key, value]) => console.log(value));
// logs 1, 2

এই উদাহরণে, একটি অ্যারের ডেস্ট্রাকচারিং অ্যাসাইনমেন্টforEach ব্যবহার করে ।


1

এটি (মূলত) বেশিরভাগ ক্ষেত্রেই ভুল:

var array = [];
array["Main"] = "Main page";

এটি নামের সাথে অ্যারেতে একটি অ-উপাদান উপাদান তৈরি করে Main। অ্যারেগুলি অবজেক্টস হলেও সাধারণত আপনি তাদের উপর অ-উপাদানগুলির বৈশিষ্ট্য তৈরি করতে চান না।

আপনি যদি arrayসেই নামগুলি দিয়ে সূচক করতে চান তবে সাধারণত আপনি একটি Mapবা সরল বস্তু ব্যবহার করেন , অ্যারে নয়।

একটি Map(ES2015 +) দিয়ে, যা আমি কল করব mapকারণ আমি সৃজনশীল:

let map = new Map();
map.set("Main", "Main page");

তারপর আপনি তার থেকে iterators ব্যবহার করে এটি পুনরুক্তি values, keysঅথবা entriesপদ্ধতি, উদাহরণস্বরূপ:

for (const value of map.values()) {
    // Here, `value` will be `"Main page"`, etc.
}

একটি সরল বস্তু ব্যবহার করে, যা আমি সৃজনশীলভাবে কল করব obj:

let obj = Object.create(null); // Creates an object with no prototype
obj.Main = "Main page"; // Or: `obj["Main"] = "Main page";`

তারপর আপনি ব্যবহার এটির সামগ্রীগুলি পুনরুক্তি চাই Object.keys, Object.valuesঅথবা Object.entries, উদাহরণস্বরূপ:

for (const value of Object.values(proches_X)) {
    // Here, `value` will be `"Main page"`, etc.
}

0

var obj = {
  no: ["no", 32],
  nt: ["no", 32],
  nf: ["no", 32, 90]
};

count = -1; // which must be static value
for (i in obj) {
  count++;
  if (obj.hasOwnProperty(i)) {
    console.log(obj[i][count])
  };
};

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

নিখুঁত পদ্ধতি, আপনি যদি আগ্রহী হন, পছন্দ করুন


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

0

তুমি এটি করতে পারো

var array = [];

// assigning values to corresponding keys
array[0] = "Main page";
array[1] = "Guide page";
array[2] = "Articles page";
array[3] = "Forum board";


array.forEach(value => {
    console.log(value)
})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.