जावास्क्रिप्ट के साथ एक JSON ऑब्जेक्ट ट्री के सभी नोडों को पार करें


148

मैं एक JSON ऑब्जेक्ट ट्री का पता लगाना चाहूंगा, लेकिन उसके लिए कोई लाइब्रेरी नहीं ढूंढ सकता। यह मुश्किल नहीं लगता, लेकिन यह पहिया को फिर से संगठित करने जैसा लगता है।

XML में बहुत सारे ट्यूटोरियल हैं जो दिखाते हैं कि DOM के साथ XML ट्री को कैसे पार करना है :(


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
क्यों फ़ंड .apply (यह, ...)? क्या यह मज़ेदार नहीं होना चाहिए (ओ, ...)?
क्रेग सेलेस्टे

4
@ParchedSquid No. यदि आप आवेदन के लिए एपीआई डॉक्स को देखते हैं () पहला पैरामीटर thisलक्ष्य फ़ंक्शन में मान है, जबकि फ़ंक्शन के oलिए पहला पैरामीटर होना चाहिए। इसे सेट करना this(जो traverseफ़ंक्शन होगा) हालांकि थोड़ा अजीब है, लेकिन यह वैसे भी संदर्भ processका उपयोग करने जैसा नहीं thisहै। यह बस के रूप में अच्छी तरह से अशक्त हो सकता था।
Thor84no

1
जिश्त के लिए सख्त मोड में, हालांकि आपको /*jshint validthis: true */इसके इस्तेमाल से होने func.apply(this,[i,o[i]]);वाली त्रुटि से बचने के लिए ऊपर जोड़ना होगाW040: Possible strict violation.this
जसदीप खालसा

4
@ जसदीपखलसा: यह सच है। लेकिन उत्तर के लेखन के समय jshint डेढ़ साल के लिए एक परियोजना के रूप में भी शुरू नहीं किया गया था।
हिप्पो

1
@Vishal आप 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) से बचें जहां v == अशक्त, क्योंकि (टाइपऑफ़ null == "ऑब्जेक्ट") === सत्य। function traverse(jsonObj) { if(jsonObj && typeof jsonObj == "object" ) { ...
मार्सेलो अमोरिम

4
मुझे पंडिताऊ ध्वनि से नफरत है, लेकिन मुझे लगता है कि इस बारे में पहले से ही बहुत भ्रम है, इसलिए केवल स्पष्टता के लिए मैं निम्नलिखित कहता हूं। JSON और जावास्क्रिप्ट ऑब्जेक्ट एक ही चीज नहीं हैं। JSON जावास्क्रिप्ट ऑब्जेक्ट्स के प्रारूपण पर आधारित है, लेकिन JSON केवल अंकन है ; यह एक वस्तु का प्रतिनिधित्व करने वाले वर्णों की एक स्ट्रिंग है। सभी JSON को JS ऑब्जेक्ट में "पार्स" किया जा सकता है, लेकिन JSON में सभी JS ऑब्जेक्ट्स को "स्ट्रिंग" नहीं किया जा सकता है। उदाहरण के लिए आत्म रेफरल जेएस ऑब्जेक्ट्स को कठोर नहीं किया जा सकता है।
जॉन

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'
pilau

32

जावास्क्रिप्ट के साथ JSON डेटा का पता लगाने के लिए एक नया पुस्तकालय है जो कई अलग-अलग उपयोग मामलों का समर्थन करता है।

https://npmjs.org/package/traverse

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

यह सभी प्रकार की जावास्क्रिप्ट वस्तुओं के साथ काम करता है। यह भी चक्र का पता लगाता है।

यह प्रत्येक नोड का मार्ग भी प्रदान करता है।


1
js-traverse भी npm के माध्यम से नोड में उपलब्ध हो सकता है।
विले

हाँ। यह सिर्फ वहाँ कहा जाता है। और उनके पास एक प्यारा सा वेब पेज है! इसे शामिल करने के लिए मेरे उत्तर को अपडेट करना।
बेंजामिन एटकिन

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

यदि आप एक वास्तविक JSON स्ट्रिंग का पता लगा रहे हैं तो आप एक रिवीवर फ़ंक्शन का उपयोग कर सकते हैं।

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

संपादित करें : इस उत्तर में सभी नीचे दिए गए उदाहरणों में @ सुपरसैन के अनुरोध के अनुसार इट्रेटर से प्राप्त एक नया पथ चर शामिल करने के लिए संपादित किया गया है । पथ चर स्ट्रिंग का एक सरणी है जहां सरणी में प्रत्येक स्ट्रिंग प्रत्येक कुंजी का प्रतिनिधित्व करता है जिसे मूल स्रोत ऑब्जेक्ट से परिणामी पुनरावृत्त मूल्य तक पहुंचने के लिए एक्सेस किया गया था। पथ चर को लॉश के गेट फ़ंक्शन / विधि में खिलाया जा सकता है । या आप अपना खुद का संस्करण लिख सकते हैं, जो कि केवल सरणियों को संभालता है जैसे:

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बाहर करना संभव बनाता है यदि आप पहले पुनरावृति को रोकना चाहते हैं तो लूप।

एक बात जो मैं नोटिस करता हूं, जिसे संबोधित नहीं किया गया है और वह मेरे मूल उत्तर में नहीं है, आपको सावधान रहना चाहिए कि वस्तुओं की मनमानी (यानी "किसी भी" यादृच्छिक "सेट) के कारण, क्योंकि जावास्क्रिप्ट ऑब्जेक्ट्स स्वयं संदर्भित हो सकते हैं। यह अनंत लूपिंग ट्रैवर्सल्स का अवसर पैदा करता है। अनमॉडिफाइड JSON डेटा हालांकि सेल्फ रेफरेंसिंग नहीं हो सकता है, इसलिए यदि आप JS ऑब्जेक्ट्स के इस विशेष सबसेट का उपयोग कर रहे हैं, तो आपको अनंत लूपिंग ट्रैवर्सल्स के बारे में चिंता करने की ज़रूरत नहीं है और आप मेरे मूल उत्तर या अन्य उत्तरों को संदर्भित कर सकते हैं। यहां एक गैर-समाप्ति ट्रैवर्सल का एक उदाहरण दिया गया है (ध्यान दें कि यह कोड का एक चलने योग्य टुकड़ा नहीं है, क्योंकि अन्यथा यह आपके ब्राउज़र टैब को क्रैश कर देगा)।

अपने संपादित उदाहरण में जनरेटर ऑब्जेक्ट में भी मैंने 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 को छोड़ने और मुख्य रूप से अधिक वर्तमान ब्राउज़रों का समर्थन करने की इच्छा नहीं रखते हैं, तो इसे करने के लिए एक नए तरीके के लिए ( संगतता के लिए kangax की es6 तालिका देखें )। आप इसके लिए es2015 जनरेटर का उपयोग कर सकते हैं । मैंने तदनुसार @ TheHippo का उत्तर अपडेट किया है। बेशक, यदि आप वास्तव में IE समर्थन चाहते हैं तो आप babel जावास्क्रिप्ट ट्रांसपिलर का उपयोग कर सकते हैं ।

//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
@supersan आप मेरे अपडेट किए गए कोड स्निपेट देख सकते हैं। मैंने हर एक के लिए एक पथ चर जोड़ा जो स्ट्रिंग की एक सरणी है। सरणी में तार मूल कुंजी ऑब्जेक्ट से परिणामी पुनरावृत्त मूल्य को प्राप्त करने के लिए एक्सेस की गई प्रत्येक कुंजी का प्रतिनिधित्व करते हैं।
जॉन

4

मैं प्रक्रिया और ट्रिगर कार्यों के उपयोग के बिना एक अनाम फ़ंक्शन में @ TheHippo के सही समाधान का उपयोग करना चाहता था। निम्नलिखित ने मेरे लिए काम किया, खुद की तरह नौसिखिए प्रोग्रामर के लिए साझा किया।

(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

अधिकांश जावास्क्रिप्ट इंजन पूंछ पुनरावृत्ति का अनुकूलन नहीं करते हैं (यह एक मुद्दा नहीं हो सकता है यदि आपका JSON गहरा नेस्टेड नहीं है), लेकिन मैं आमतौर पर सावधानी के पक्ष में गलती करता हूं और इसके बजाय पुनरावृत्ति करता हूं, जैसे।

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

इनपुट JSON:

[
    {
        "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
संग

-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'}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.