জাভাস্ক্রিপ্টের সাহায্যে জেএসওএন অবজেক্ট ট্রিের সমস্ত নোডকে অতিক্রম করুন


148

আমি একটি JSON অবজেক্ট ট্রিটি অতিক্রম করতে চাই, তবে এর জন্য কোনও লাইব্রেরি খুঁজে পাচ্ছি না। এটি কঠিন বলে মনে হচ্ছে না তবে এটি চাকাটি পুনর্নির্মাণের মতো মনে হচ্ছে।

এক্সএমএলে এমন অনেক টিউটোরিয়াল রয়েছে যা কীভাবে ডমের সাহায্যে এক্সএমএল ট্রিটি অতিক্রম করতে পারে তা দেখায় :(


1
আইট্রেটার তৈরি IIFE github.com/eltomjan/ETEhomeTools/blob/master/HTM_HTA/… এটি পূর্বনির্ধারিত (বেসিক) ডিপথ ফার্স্ট এবং ব্রেডথ ফার্স্ট এবং পুনরাবৃত্তি ছাড়াই JSON কাঠামোর ভিতরে যাওয়ার ক্ষমতা রয়েছে।
টম

উত্তর:


222

আপনি যদি ভাবেন যে jQuery এই জাতীয় প্রাথমিক কাজের জন্য একধরণের ওভারকিল হয় তবে আপনি এরকম কিছু করতে পারেন:

//your object
var o = { 
    foo:"bar",
    arr:[1,2,3],
    subo: {
        foo2:"bar2"
    }
};

//called with every property and its value
function process(key,value) {
    console.log(key + " : "+value);
}

function traverse(o,func) {
    for (var i in o) {
        func.apply(this,[i,o[i]]);  
        if (o[i] !== null && typeof(o[i])=="object") {
            //going one step down in the object tree!!
            traverse(o[i],func);
        }
    }
}

//that's all... no magic, no bloated framework
traverse(o,process);

2
কেন তহবিল.এপ্লাই (এটি, ...)? এটি func.apply (ও, ...) হওয়া উচিত নয়?
ক্রেগ Celeste

4
@ পারচেডস্কুইড নং। আপনি যদি প্রয়োগের জন্য API ডক্সকে লক্ষ্য করেন () তবে প্রথম প্যারামিটারটি thisলক্ষ্য ফাংশনের মান, তবে ফাংশনের oপ্রথম পরামিতি হওয়া উচিত। এটিকে সেট করা this(যা traverseফাংশনটি হবে) যদিও কিছুটা অদ্ভুত, তবে যাইহোক রেফারেন্সটি processব্যবহার করার মতো নয় this। এটি ঠিক পাশাপাশি বাতিল হতে পারে।
Thor84no

1
কঠোর মোডে জশিন্টের জন্য যদিও ব্যবহারের ফলে সৃষ্ট ত্রুটি এড়াতে আপনাকে /*jshint validthis: true */উপরে যোগ করতে হতে func.apply(this,[i,o[i]]);পারেW040: Possible strict violation.this
জসদীপ খালসা

4
@ জাসদীপখালসা: সত্য। তবে উত্তর লেখার সময় জিশিন্ট এমনকি দেড় বছর ধরে একটি প্রকল্প হিসাবে শুরু করা হয়নি।
দি হিপ্পো

1
@ বিশাল আপনি সেই traverseফাংশনে একটি 3 টি প্যারামিটার যুক্ত করতে পারেন যা গভীরতা ট্র্যাক করে। ওয়েেন কলিং পুনরাবৃত্তভাবে বর্তমান স্তরে 1 যোগ করে।
দি হিপ্পো

75

একটি JSON অবজেক্ট কেবল একটি জাভাস্ক্রিপ্ট অবজেক্ট। এটাই আসলে JSON এর অর্থ: জাভাস্ক্রিপ্ট অবজেক্ট নোটেশন। সুতরাং আপনি একটি JSON অবজেক্টটি অতিক্রম করতে পারবেন তবে আপনি সাধারণভাবে কোনও জাভাস্ক্রিপ্ট অবজেক্টকে "ট্র্যাভার্স" করতে পছন্দ করেন।

ES2017 এ আপনি করবেন:

Object.entries(jsonObj).forEach(([key, value]) => {
    // do something with key and val
});

আপনি সর্বদা অবজেক্টে অবতরণ করতে একটি ফাংশন লিখতে পারেন:

function traverse(jsonObj) {
    if( jsonObj !== null && typeof jsonObj == "object" ) {
        Object.entries(jsonObj).forEach(([key, value]) => {
            // key is either an array index or object key
            traverse(value);
        });
    }
    else {
        // jsonObj is a number or string
    }
}

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


9
V == নাল যেখানে travers (v) এড়িয়ে চলুন, কারণ (টাইপফুল নাল == "অবজেক্ট") === সত্য true function traverse(jsonObj) { if(jsonObj && typeof jsonObj == "object" ) { ...
মার্সেলো

4
আমি পেডেন্টিক শব্দগুলি ঘৃণা করি, তবে আমি মনে করি এটি সম্পর্কে ইতিমধ্যে প্রচুর বিভ্রান্তি রয়েছে, সুতরাং কেবল স্পষ্টতার জন্য আমি নিম্নলিখিতটি বলছি। জেএসএন এবং জাভাস্ক্রিপ্ট অবজেক্টগুলি একই জিনিস নয়। জেএসএন জাভাস্ক্রিপ্ট অবজেক্টের বিন্যাসের উপর ভিত্তি করে তৈরি হয়েছে, তবে জেএসওএন কেবল স্বরলিপি ; এটি অক্ষরের একটি স্ট্রিং যা কোনও বস্তুর প্রতিনিধিত্ব করে। সমস্ত JSON একটি JS অবজেক্টে "পার্সড" করা যেতে পারে, তবে সমস্ত JS অবজেক্টকে JSON এ "স্ট্রিংফাইন্ড" করা যায় না। উদাহরণস্বরূপ স্ব-রেফারেনশিয়াল জেএস অবজেক্টগুলিকে স্ট্রিংফাই করা যাবে না।
জন

36
function traverse(o) {
    for (var i in o) {
        if (!!o[i] && typeof(o[i])=="object") {
            console.log(i, o[i]);
            traverse(o[i]);
        } else {
            console.log(i, o[i]);
        }
    }
}

6
কেন আপনি তা ব্যাখ্যা করতে পারেন much better?
ডেমেন্টিক

3
পদ্ধতিটি যদি লগ ব্যতীত অন্য কিছু করতে চায় তবে আপনার নাল পরীক্ষা করা উচিত, নাল এখনও একটি অবজেক্ট।
wi1

3
@ আপনার সাথে একমত wi1, জন্য চেক পারে!!o[i] && typeof o[i] == 'object'
পলান্ন

32

জাভাস্ক্রিপ্টের সাথে জেএসএন ডেটা ট্র্যাভার্স করার জন্য একটি নতুন গ্রন্থাগার রয়েছে যা বিভিন্ন ব্যবহারের বিভিন্ন ক্ষেত্রে সমর্থন করে।

https://npmjs.org/package/traverse

https://github.com/substack/js-traverse

এটি সব ধরণের জাভাস্ক্রিপ্ট অবজেক্টের সাথে কাজ করে। এমনকি এটি চক্র সনাক্ত করে।

এটি প্রতিটি নোডের পথও সরবরাহ করে।


1
js-travers node.js. তে এনপিএমের মাধ্যমে উপলব্ধ বলে মনে হয়
ভিল 21

হ্যাঁ. এটি কেবল সেখানে ট্র্যাভার্স বলা হয়। এবং তাদের একটি সুন্দর ওয়েব পৃষ্ঠা আছে! এটি অন্তর্ভুক্ত করার জন্য আমার উত্তর আপডেট করা।
বেনিয়ামিন আটকিন

15

আপনি যা করতে চান তার উপর নির্ভর করে। এখানে একটি জাভাস্ক্রিপ্ট অবজেক্ট ট্রি, মুদ্রণ কী এবং মানগুলি যেমন যায় তেমন অনুসরণ করার উদাহরণ দেওয়া আছে:

function js_traverse(o) {
    var type = typeof o 
    if (type == "object") {
        for (var key in o) {
            print("key: ", key)
            js_traverse(o[key])
        }
    } else {
        print(o)
    }
}

js> foobar = {foo: "bar", baz: "quux", zot: [1, 2, 3, {some: "hash"}]}
[object Object]
js> js_traverse(foobar)                 
key:  foo
bar
key:  baz
quux
key:  zot
key:  0
1
key:  1
2
key:  2
3
key:  3
key:  some
hash

9

যদি আপনি কোনও আসল জেএসএন স্ট্রিংটি অনুসরণ করে থাকেন তবে আপনি একটি রিভিভার ফাংশন ব্যবহার করতে পারেন।

function traverse (json, callback) {
  JSON.parse(json, function (key, value) {
    if (key !== '') {
      callback.call(this, key, value)
    }
    return value
  })
}

traverse('{"a":{"b":{"c":{"d":1}},"e":{"f":2}}}', function (key, value) {
  console.log(arguments)
})

যখন কোনও বস্তুটি অনুসরণ করা হয়:

function traverse (obj, callback, trail) {
  trail = trail || []

  Object.keys(obj).forEach(function (key) {
    var value = obj[key]

    if (Object.getPrototypeOf(value) === Object.prototype) {
      traverse(value, callback, trail.concat(key))
    } else {
      callback.call(obj, key, value, trail)
    }
  })
}

traverse({a: {b: {c: {d: 1}}, e: {f: 2}}}, function (key, value, trail) {
  console.log(arguments)
})

8

সম্পাদনা : এই উত্তরের নীচের সমস্ত উদাহরণসমূহ @ সুপারসানের অনুরোধ অনুসারে পুনরাবৃত্তকারী থেকে প্রাপ্ত নতুন পথের পরিবর্তনশীলকে অন্তর্ভুক্ত করার জন্য সম্পাদনা করা হয়েছে । পাথ ভেরিয়েবল হল স্ট্রিংগুলির একটি অ্যারে যেখানে অ্যারের প্রতিটি স্ট্রিং প্রতিটি কীটি উপস্থাপন করে যা মূল উত্স অবজেক্ট থেকে ফলাফল পুনরাবৃত্ত মানটিতে প্রবেশ করতে অ্যাক্সেস করা হয়েছিল 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);
}


দুর্দান্ত উত্তর! প্রতিটি কী কী ট্রান্সক্রিপশন করা হচ্ছে তার জন্য কি অ্যাবিসি, অ্যাবিসিডি ইত্যাদির মতো পথগুলি ফেরানো সম্ভব?
সুপারসান

1
@ সুপারসান আপনি আমার আপডেট হওয়া কোড স্নিপেটগুলি দেখতে পারেন। আমি প্রত্যেকটির সাথে একটি পাথ ভেরিয়েবল যুক্ত করেছি যা স্ট্রিংগুলির একটি অ্যারে। অ্যারেতে থাকা স্ট্রিংগুলি প্রতিটি কীটি উপস্থাপন করে যা মূল উত্স অবজেক্ট থেকে ফলাফল পুনরাবৃত্ত মানটি পেতে অ্যাক্সেস করা হয়েছিল key
জন

4

প্রক্রিয়া এবং ট্রিগার ফাংশন ব্যবহার না করে আমি কোনও বেনামে @ হিপ্পোর নিখুঁত সমাধানটি ব্যবহার করতে চেয়েছিলাম। নীচেরগুলি আমার মতো নবজাতক প্রোগ্রামারদের জন্য ভাগ করে নেওয়ার জন্য কাজ করেছিল।

(function traverse(o) {
    for (var i in o) {
        console.log('key : ' + i + ', value: ' + o[i]);

        if (o[i] !== null && typeof(o[i])=="object") {
            //going on step down in the object tree!!
            traverse(o[i]);
        }
    }
  })
  (json);

2

বেশিরভাগ জাভাস্ক্রিপ্ট ইঞ্জিনগুলি টেল রিকার্সনটি অনুকূল করে না (আপনার জেএসওএন গভীরভাবে বাসা বাঁধতে না পারলে এটি কোনও সমস্যা হতে পারে না) তবে আমি সাধারণত সাবধানতার দিক থেকে ভুল করে এর পরিবর্তে পুনরাবৃত্তি করি, যেমন

function traverse(o, fn) {
    const stack = [o]

    while (stack.length) {
        const obj = stack.shift()

        Object.keys(obj).forEach((key) => {
            fn(key, obj[key], obj)
            if (obj[key] instanceof Object) {
                stack.unshift(obj[key])
                return
            }
        })
    }
}

const o = {
    name: 'Max',
    legal: false,
    other: {
        name: 'Maxwell',
        nested: {
            legal: true
        }
    }
}

const fx = (key, value, obj) => console.log(key, value)
traverse(o, fx)

0

আমার স্ক্রিপ্ট:

op_needed = [];
callback_func = function(val) {
  var i, j, len;
  results = [];
  for (j = 0, len = val.length; j < len; j++) {
    i = val[j];
    if (i['children'].length !== 0) {
      call_func(i['children']);
    } else {
      op_needed.push(i['rel_path']);
    }
  }
  return op_needed;
};

ইনপুট জেএসএন:

[
    {
        "id": null, 
        "name": "output",   
        "asset_type_assoc": [], 
        "rel_path": "output",
        "children": [
            {
                "id": null, 
                "name": "output",   
                "asset_type_assoc": [], 
                "rel_path": "output/f1",
                "children": [
                    {
                        "id": null, 
                        "name": "v#",
                        "asset_type_assoc": [], 
                        "rel_path": "output/f1/ver",
                        "children": []
                    }
                ]
            }
       ]
   }
]

ফাংশন কল:

callback_func(inp_json);

আমার প্রয়োজন অনুসারে আউটপুট:

["output/f1/ver"]

0

var test = {
    depth00: {
        depth10: 'string'
        , depth11: 11
        , depth12: {
            depth20:'string'
            , depth21:21
        }
        , depth13: [
            {
                depth22:'2201'
                , depth23:'2301'
            }
            , {
                depth22:'2202'
                , depth23:'2302'
            }
        ]
    }
    ,depth01: {
        depth10: 'string'
        , depth11: 11
        , depth12: {
            depth20:'string'
            , depth21:21
        }
        , depth13: [
            {
                depth22:'2201'
                , depth23:'2301'
            }
            , {
                depth22:'2202'
                , depth23:'2302'
            }
        ]
    }
    , depth02: 'string'
    , dpeth03: 3
};


function traverse(result, obj, preKey) {
    if(!obj) return [];
    if (typeof obj == 'object') {
        for(var key in obj) {
            traverse(result, obj[key], (preKey || '') + (preKey ? '[' +  key + ']' : key))
        }
    } else {
        result.push({
            key: (preKey || '')
            , val: obj
        });
    }
    return result;
}

document.getElementById('textarea').value = JSON.stringify(traverse([], test), null, 2);
<textarea style="width:100%;height:600px;" id="textarea"></textarea>


এটা ফর্মটি জমা দিতে তৈরি enctype applicatioin / JSON
Seung

-1

আমার জন্য সর্বোত্তম সমাধানটি ছিল:

সহজ এবং কোনও ফ্রেমওয়ার্ক ব্যবহার না করে

    var doSomethingForAll = function (arg) {
       if (arg != undefined && arg.length > 0) {
            arg.map(function (item) {
                  // do something for item
                  doSomethingForAll (item.subitem)
             });
        }
     }

-1

আপনি সমস্ত কী / মান পেতে এবং এটির মাধ্যমে শ্রেণিবিন্যাস সংরক্ষণ করতে পারেন

// get keys of an object or array
function getkeys(z){
  var out=[]; 
  for(var i in z){out.push(i)};
  return out;
}

// print all inside an object
function allInternalObjs(data, name) {
  name = name || 'data';
  return getkeys(data).reduce(function(olist, k){
    var v = data[k];
    if(typeof v === 'object') { olist.push.apply(olist, allInternalObjs(v, name + '.' + k)); }
    else { olist.push(name + '.' + k + ' = ' + v); }
    return olist;
  }, []);
}

// run with this
allInternalObjs({'a':[{'b':'c'},{'d':{'e':5}}],'f':{'g':'h'}}, 'ob')

এটি ( https://stackoverflow.com/a/25063574/1484447 ) এ একটি পরিবর্তন রয়েছে


-1
             var localdata = [{''}]// Your json array
              for (var j = 0; j < localdata.length; j++) 
               {$(localdata).each(function(index,item)
                {
                 $('#tbl').append('<tr><td>' + item.FirstName +'</td></tr>);
                 }

-1

গভীর নেস্টেড জেএস বিষয়বস্তুগুলি অনুসরণ করতে এবং সম্পাদনা করার জন্য আমি গ্রন্থাগার তৈরি করেছি। এখানে এপিআই দেখুন: https://github.com/dominik791

আপনি ডেমো অ্যাপ্লিকেশনটি ইন্টারেক্টিভভাবে লাইব্রেরিতে খেলতে পারেন: https://dominik791.github.io/obj-traverse-demo/

ব্যবহারের উদাহরণ: আপনার সর্বদা রুট অবজেক্ট থাকা উচিত যা প্রতিটি পদ্ধতির প্রথম পরামিতি:

var rootObj = {
  name: 'rootObject',
  children: [
    {
      'name': 'child1',
       children: [ ... ]
    },
    {
       'name': 'child2',
       children: [ ... ]
    }
  ]
};

দ্বিতীয় প্যারামিটারটি সর্বদা সম্পত্তিটির নাম যা নেস্টেড অবজেক্টগুলিকে ধারণ করে। উপরের ক্ষেত্রে এটি হবে 'children'

তৃতীয় প্যারামিটার হ'ল একটি বস্তু যা আপনি অবজেক্ট / অবজেক্টগুলি সন্ধান করতে ব্যবহার করেন যা আপনি সন্ধান / পরিবর্তন করতে / মুছতে চান। উদাহরণস্বরূপ আপনি যদি 1 এর সমান আইডি সহ অবজেক্টটি সন্ধান করেন তবে আপনি { id: 1}তৃতীয় প্যারামিটার হিসাবে পাস করবেন ।

এবং তুমি পারো:

  1. findFirst(rootObj, 'children', { id: 1 }) সঙ্গে প্রথম বস্তু সন্ধান করতে id === 1
  2. findAll(rootObj, 'children', { id: 1 }) সঙ্গে সমস্ত বস্তু সন্ধান id === 1
  3. findAndDeleteFirst(rootObj, 'children', { id: 1 }) প্রথম মিলের বস্তু মুছতে
  4. findAndDeleteAll(rootObj, 'children', { id: 1 }) সমস্ত মিলে যাওয়া অবজেক্ট মুছতে

replacementObj দুটি শেষ পদ্ধতিতে শেষ প্যারামিটার হিসাবে ব্যবহৃত হয়:

  1. findAndModifyFirst(rootObj, 'children', { id: 1 }, { id: 2, name: 'newObj'})এর সাথে প্রথম পাওয়া বস্তুকে পরিবর্তন id === 1করতে{ id: 2, name: 'newObj'}
  2. findAndModifyAll(rootObj, 'children', { id: 1 }, { id: 2, name: 'newObj'})এর সাথে সমস্ত বস্তু পরিবর্তন id === 1করতে{ id: 2, name: 'newObj'}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.