সম্পাদনা : এই উত্তরের নীচের সমস্ত উদাহরণসমূহ @ সুপারসানের অনুরোধ অনুসারে পুনরাবৃত্তকারী থেকে প্রাপ্ত নতুন পথের পরিবর্তনশীলকে অন্তর্ভুক্ত করার জন্য সম্পাদনা করা হয়েছে । পাথ ভেরিয়েবল হল স্ট্রিংগুলির একটি অ্যারে যেখানে অ্যারের প্রতিটি স্ট্রিং প্রতিটি কীটি উপস্থাপন করে যা মূল উত্স অবজেক্ট থেকে ফলাফল পুনরাবৃত্ত মানটিতে প্রবেশ করতে অ্যাক্সেস করা হয়েছিল key পাথের ভেরিয়েবলটি লোডাসের গেম ফাংশন / পদ্ধতিতে খাওয়ানো যেতে পারে । অথবা আপনি নিজের নিজের লোডাসের সংস্করণ লিখতে পারেন যা কেবলমাত্র অ্যারে পরিচালনা করে:
function get (object, path) {
return path.reduce((obj, pathItem) => obj ? obj[pathItem] : undefined, object);
}
const example = {a: [1,2,3], b: 4, c: { d: ["foo"] }};
// these paths exist on the object
console.log(get(example, ["a", "0"]));
console.log(get(example, ["c", "d", "0"]));
console.log(get(example, ["b"]));
// these paths do not exist on the object
console.log(get(example, ["e", "f", "g"]));
console.log(get(example, ["b", "f", "g"]));
সম্পাদনা : এই সম্পাদিত উত্তরটি অসীম লুপিং ট্র্যাভারসালগুলি সমাধান করে।
পেস্কি অসীম অবজেক্ট ট্র্যাভারসাল বন্ধ করা
এই সম্পাদিত উত্তরটি এখনও আমার মূল উত্তরের একটি যুক্ত সুবিধাগুলি সরবরাহ করে যা আপনাকে সরবরাহকৃত জেনারেটর ফাংশনটি একটি পরিষ্কার এবং সহজ পুনরাবৃত্তিযোগ্য ইন্টারফেস ব্যবহার করার জন্য অনুমতি দেয় ( for of
লুপগুলি for(var a of b)
যেখানে b
পুনরাবৃত্তিযোগ্য এবং ভাবার a
উপাদানগুলির একটি উপাদান হিসাবে ব্যবহার করার জন্য ভাবেন )। সরল এপিআই হওয়ার পাশাপাশি জেনারেটর ফাংশনটি ব্যবহার করে কোড তৈরি করে এটি পুনরায় ব্যবহারের ক্ষেত্রেও সহায়তা করে যাতে আপনি যে কোনও জায়গার বৈশিষ্ট্যের উপর গভীরভাবে পুনরাবৃত্তি করতে চান যেখানেই পুনরাবৃত্তি যুক্তিটি পুনরাবৃত্তি করতে হবে না এবং এটি এর break
বাইরে বেরিয়ে আসাও সম্ভব করে তোলে লুপটি যদি আপনি আগে পুনরাবৃত্তি থামাতে চান।
একটি জিনিস যা আমি লক্ষ্য করেছি যা সম্বোধন করা হয়নি এবং এটি আমার মূল উত্তরে নয় তা হ'ল আপনার সাবধানে ট্র্যাভারিং করা নির্বিচারে (যেমন কোনও "এলোমেলো" সেট) অবজেক্ট হওয়া উচিত, কারণ জাভাস্ক্রিপ্ট অবজেক্টগুলি স্ব-রেফারেন্সিং হতে পারে। এটি অসীম লুপিং ট্রভারসালগুলি থাকার সুযোগ তৈরি করে। অপরিবর্তিত জেএসওন ডেটা তবে স্ব-রেফারেন্সিং হতে পারে না, সুতরাং আপনি যদি জেএস বস্তুর এই নির্দিষ্ট উপসেটটি ব্যবহার করছেন তবে আপনাকে অসীম লুপিং ট্র্যাভারসালগুলি নিয়ে চিন্তা করতে হবে না এবং আপনি আমার মূল উত্তর বা অন্যান্য উত্তরগুলি উল্লেখ করতে পারেন। এখানে অবসানহীন ট্র্যাভারসালের একটি উদাহরণ রয়েছে (নোট করুন এটি কোডের একটি চলমান টুকরো নয়, কারণ তা না হলে এটি আপনার ব্রাউজার ট্যাবটি ক্র্যাশ করবে)।
এছাড়াও আমার সম্পাদিত উদাহরণে জেনারেটর অবজেক্টে আমি ব্যবহারের বিকল্প বেছে নিয়েছি যার Object.keys
পরিবর্তে for in
কেবলমাত্র বস্তুর নন-প্রোটোটাইপ কীগুলি পুনরাবৃত্তি করে। আপনি যদি প্রোটোটাইপ কীগুলি অন্তর্ভুক্ত করতে চান তবে আপনি নিজেই এটিকে পরিবর্তন করতে পারেন। Object.keys
এবং সাথে উভয় প্রয়োগের জন্য নীচে আমার মূল উত্তর বিভাগটি দেখুন for in
।
খারাপ - এটি স্ব-রেফারেন্সিয়াল অবজেক্টগুলিতে অসীম লুপ আসবে:
//your object
var o = {
foo:"bar",
arr:[1,2,3],
subo: {
foo2:"bar2"
}
};
// this self-referential property assignment is the only edited line
// from the below original example which makes the traversal
// non-terminating (i.e. it makes it infinite loop)
o.o = o;
function* traverse(o, path=[]) {
for (var i of Object.keys(o)) {
const itemPath = path.concat(i);
yield [i,o[i],itemPath];
if (o[i] !== null && typeof(o[i])=="object") {
//going one step down in the object tree!!
yield* traverse(o[I], itemPath);
}
}
}
//that's all... no magic, no bloated framework
for(var [key, value, path] of traverse(o)) {
// do something here with each key and value
console.log(key, value, path);
}
এ থেকে নিজেকে বাঁচাতে আপনি একটি ক্লোজারের মধ্যে একটি সেট যুক্ত করতে পারেন, যাতে ফাংশনটি প্রথমে বলা হয়ে গেলে এটি দেখা বস্তুগুলির একটি স্মৃতি তৈরি করতে শুরু করে এবং এটি ইতিমধ্যে দেখা কোনও বস্তু জুড়ে এসে পুনরাবৃত্তিটি অবিরত করে না। নীচের কোড স্নিপেট এটি করে এবং এভাবে অসীম লুপিং কেস পরিচালনা করে।
আরও ভাল - এটি স্ব-রেফারেন্সিয়াল অবজেক্টগুলিতে অনন্ত লুপ দেবে না:
//your object
var o = {
foo:"bar",
arr:[1,2,3],
subo: {
foo2:"bar2"
}
};
// this self-referential property assignment is the only edited line
// from the below original example which makes more naive traversals
// non-terminating (i.e. it makes it infinite loop)
o.o = o;
function* traverse(o) {
const memory = new Set();
function * innerTraversal (o, path=[]) {
if(memory.has(o)) {
// we've seen this object before don't iterate it
return;
}
// add the new object to our memory.
memory.add(o);
for (var i of Object.keys(o)) {
const itemPath = path.concat(i);
yield [i,o[i],itemPath];
if (o[i] !== null && typeof(o[i])=="object") {
//going one step down in the object tree!!
yield* innerTraversal(o[i], itemPath);
}
}
}
yield* innerTraversal(o);
}
console.log(o);
//that's all... no magic, no bloated framework
for(var [key, value, path] of traverse(o)) {
// do something here with each key and value
console.log(key, value, path);
}
আসল উত্তর
আপনি যদি IE বাদ না পড়েন এবং প্রধানত আরও বর্তমান ব্রাউজারগুলিকে সমর্থন করেন তবে এটি করার নতুন পদ্ধতির জন্য (সামঞ্জস্যের জন্য কঙ্গাক্সের এস 6 টেবিলটি দেখুন )। আপনি এর জন্য es2015 জেনারেটর ব্যবহার করতে পারেন । আমি সেই অনুসারে @ দ্য হিপ্পোর উত্তর আপডেট করেছি। অবশ্যই আপনি কি সত্যিই আই ই সমর্থন আপনি ব্যবহার করতে পারেন চান তাহলে Babel জাভাস্ক্রিপ্ট transpiler।
//your object
var o = {
foo:"bar",
arr:[1,2,3],
subo: {
foo2:"bar2"
}
};
function* traverse(o, path=[]) {
for (var i in o) {
const itemPath = path.concat(i);
yield [i,o[i],itemPath];
if (o[i] !== null && typeof(o[i])=="object") {
//going one step down in the object tree!!
yield* traverse(o[i], itemPath);
}
}
}
//that's all... no magic, no bloated framework
for(var [key, value, path] of traverse(o)) {
// do something here with each key and value
console.log(key, value, path);
}
আপনি যদি কেবল নিজস্ব গণ্যমান্য বৈশিষ্ট্য (মূলত অ-প্রোটোটাইপ চেইন বৈশিষ্ট্য) চান তবে আপনি এটির পরিবর্তে আবার Object.keys
একটি for...of
লুপ ব্যবহার করে পুনরায় পরিবর্তন করতে পারেন :
//your object
var o = {
foo:"bar",
arr:[1,2,3],
subo: {
foo2:"bar2"
}
};
function* traverse(o,path=[]) {
for (var i of Object.keys(o)) {
const itemPath = path.concat(i);
yield [i,o[i],itemPath];
if (o[i] !== null && typeof(o[i])=="object") {
//going one step down in the object tree!!
yield* traverse(o[i],itemPath);
}
}
}
//that's all... no magic, no bloated framework
for(var [key, value, path] of traverse(o)) {
// do something here with each key and value
console.log(key, value, path);
}