สำรวจโหนดทั้งหมดของทรีวัตถุ JSON ด้วย JavaScript


148

ฉันต้องการสำรวจแผนผังวัตถุ JSON แต่ไม่พบไลบรารีใด ๆ ดูไม่ยาก แต่ให้ความรู้สึกเหมือนการพลิกโฉมพวงมาลัย

ใน XML มีบทช่วยสอนมากมายที่แสดงวิธีสำรวจทรี XML ด้วย DOM :(


1
ทำให้ iterator IIFE github.com/eltomjan/ETEhomeTools/blob/master/HTM_HTA/มีการกำหนดไว้ล่วงหน้า (ขั้นพื้นฐาน) DepthFirst & BreadthFirst ถัดไปและความสามารถในการเคลื่อนที่ภายในโครงสร้าง JSON โดยไม่ต้องเรียกซ้ำ
Tom

คำตอบ:


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
ทำไมต้องใช้ fund.apply (นี่, ... )? ไม่ควรจะเป็น func.apply (o, ... )?
Craig Celeste

4
@ParchedSquid ไม่หากคุณดูที่เอกสาร API เพื่อใช้ ()พารามิเตอร์แรกคือthisค่าในฟังก์ชั่นเป้าหมายในขณะที่oควรเป็นพารามิเตอร์แรกของฟังก์ชั่น การตั้งค่าเป็นthis(ซึ่งจะเป็นtraverseฟังก์ชั่น) นั้นค่อนข้างแปลก แต่ก็ไม่เหมือนกับการprocessใช้การthisอ้างอิงอยู่ดี มันอาจจะเป็นโมฆะก็ได้
Thor84no

1
สำหรับ jshint ในโหมดเข้มงวดแม้ว่าคุณอาจจะต้องเพิ่ม/*jshint validthis: true */ข้างต้นfunc.apply(this,[i,o[i]]);เพื่อหลีกเลี่ยงข้อผิดพลาดที่W040: Possible strict violation.เกิดจากการใช้this
Jasdeep Khalsa

4
@jasdeepkhalsa: จริง แต่ในช่วงเวลาของการเขียนคำตอบ jshint ยังไม่ได้เริ่มเป็นโครงการสำหรับหนึ่งปีครึ่ง
TheHippo

1
@Vishal คุณสามารถเพิ่ม 3 พารามิเตอร์ในtraverseฟังก์ชั่นที่ติดตามความลึก Wenn เรียกซ้ำเพิ่ม 1 ถึงระดับปัจจุบัน
TheHippo

75

วัตถุ JSON เป็นเพียงวัตถุ Javascript ที่จริงแล้วสิ่งที่ JSON หมายถึง: สัญลักษณ์วัตถุ JavaScript ดังนั้นคุณจะสำรวจวัตถุ JSON แต่คุณเลือกที่จะ "สำรวจ" วัตถุ Javascript โดยทั่วไป

ใน 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 เนื่องจาก (typeof null == "object") === จริง function traverse(jsonObj) { if(jsonObj && typeof jsonObj == "object" ) { ...
Marcelo Amorim

4
ฉันเกลียดที่จะฟังเรื่องอื้อฉาว แต่ฉันคิดว่ามันมีความสับสนมากมายเกี่ยวกับเรื่องนี้ดังนั้นฉันจึงพูดดังต่อไปนี้เพื่อความชัดเจน วัตถุ JSON และ JavaScript ไม่เหมือนกัน JSON จะขึ้นอยู่กับการจัดรูปแบบของวัตถุ JavaScript แต่ JSON เป็นเพียงสัญกรณ์ ; มันเป็นสตริงของตัวละครที่เป็นตัวแทนของวัตถุ JSON ทั้งหมดสามารถ "แจง" ลงในวัตถุ JS แต่วัตถุ JS ทั้งหมดไม่สามารถ "stringified" ลงใน 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ไหมว่าเพราะอะไร
Dementic

3
หากวิธีการนี้มีไว้เพื่อทำสิ่งอื่นนอกเหนือจากบันทึกคุณควรตรวจสอบว่า Null เป็นโมฆะหรือไม่
Wi1

3
@ wi1 เห็นด้วยกับคุณสามารถตรวจสอบได้!!o[i] && typeof o[i] == 'object'
pilau

32

มีไลบรารีใหม่สำหรับการสำรวจข้อมูล JSON ด้วย JavaScript ที่รองรับกรณีการใช้งานที่แตกต่างกันมากมาย

https://npmjs.org/package/traverse

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

ใช้งานได้กับวัตถุ JavaScript ทุกชนิด มันยังตรวจจับรอบ

มันให้เส้นทางของแต่ละโหนดด้วย


1
ดูเหมือนว่า js-traverse พร้อมใช้งานผ่าน npm ใน node.js
วิลล์

ใช่. มันเป็นแค่การท่องที่นั่น และพวกเขาก็มีหน้าเว็บที่น่ารัก! อัปเดตคำตอบของฉันเพื่อรวมไว้
Benjamin Atkin

15

ขึ้นอยู่กับสิ่งที่คุณต้องการจะทำ นี่คือตัวอย่างของการสำรวจทรีของวัตถุ JavaScript, การพิมพ์คีย์และค่าต่างๆ

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 จริงคุณสามารถใช้ฟังก์ชัน reviver ได้

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

แก้ไข : ทุกด้านล่างตัวอย่างในคำตอบนี้ได้รับการแก้ไขจะรวมตัวแปรเส้นทางใหม่ให้ผลจาก iterator ตาม@ คำขอ ตัวแปรเส้นทางคืออาร์เรย์ของสตริงที่แต่ละสตริงในอาร์เรย์แสดงถึงแต่ละคีย์ที่เข้าถึงเพื่อรับค่าซ้ำที่เกิดขึ้นจากวัตถุต้นฉบับ ตัวแปรเส้นทางสามารถป้อนเข้าฟังก์ชั่นได้รับ lodash ของ / วิธีการ หรือคุณสามารถเขียนรุ่น Lodash ของคุณเองซึ่งจัดการเฉพาะอาร์เรย์เช่น:

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"]));

แก้ไข : คำตอบที่แก้ไขนี้แก้ traversals วนลูปไม่สิ้นสุด

การหยุด Traversals ของวัตถุที่ไม่มีที่สิ้นสุดน่าชัง

คำตอบที่แก้ไขนี้ยังให้หนึ่งในประโยชน์เพิ่มเติมของคำตอบเดิมของฉันซึ่งช่วยให้คุณใช้ฟังก์ชันตัวสร้างที่ให้ไว้เพื่อใช้ส่วนต่อประสานที่เรียบง่ายและเป็นระเบียบ(คิดว่าใช้for ofลูปเหมือนในfor(var a of b)ที่ที่bสามารถทำซ้ำได้และaเป็นองค์ประกอบของ ) โดยใช้ฟังก์ชั่นเครื่องกำเนิดไฟฟ้าพร้อมกับการเป็น API ง่ายมันก็จะช่วยให้มีรหัสนำมาใช้ใหม่โดยการทำให้มันเพื่อให้คุณไม่ต้องทำซ้ำตรรกะซ้ำทุกที่ที่คุณต้องการที่จะย้ำลึกเกี่ยวกับคุณสมบัติของวัตถุและมันยังทำให้มันเป็นไปได้ที่จะbreakออกจาก วนรอบหากคุณต้องการหยุดการทำซ้ำก่อนหน้านี้

สิ่งหนึ่งที่ฉันสังเกตเห็นว่ายังไม่ได้รับการแก้ไขและที่ไม่ได้อยู่ในคำตอบเดิมของฉันคือคุณควรระมัดระวังการข้ามวัตถุ (เช่นชุดสุ่ม) ใด ๆ โดยพลการเนื่องจากวัตถุ JavaScript สามารถอ้างอิงตัวเองได้ สิ่งนี้จะสร้างโอกาสที่จะมีการวนรอบแบบไม่สิ้นสุด ข้อมูล JSON ที่ไม่ได้แก้ไข แต่ไม่สามารถอ้างอิงตัวเองได้ดังนั้นหากคุณใช้ชุดย่อยของวัตถุ JS นี้คุณไม่ต้องกังวลกับการวนซ้ำวนวนวนไม่สิ้นสุดและคุณสามารถอ้างอิงคำตอบดั้งเดิมของฉันหรือคำตอบอื่น ๆ ได้ นี่คือตัวอย่างของการแวะผ่านที่ไม่มีที่สิ้นสุด (โปรดทราบว่ามันไม่ใช่โค้ดที่รันได้เพราะมิฉะนั้นมันจะทำให้แท็บเบราว์เซอร์ของคุณเสียหาย)

นอกจากนี้ในวัตถุตัวสร้างในตัวอย่างที่แก้ไขของฉันฉันเลือกที่จะใช้Object.keysแทนfor inซึ่งจะทำซ้ำเฉพาะคีย์ที่ไม่ใช่ต้นแบบบนวัตถุ คุณสามารถสลับได้ด้วยตัวคุณเองหากคุณต้องการให้มีปุ่มตัวต้นแบบรวมอยู่ด้วย ดูในส่วนคำตอบของฉันเดิมด้านล่างสำหรับการใช้งานทั้งที่มีและObject.keysfor 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 และสนับสนุนเบราว์เซอร์ปัจจุบันเป็นส่วนใหญ่ (ตรวจสอบตาราง es6 ของ kangaxเพื่อความเข้ากันได้) คุณสามารถใช้เครื่องกำเนิดไฟฟ้า es2015 สำหรับสิ่งนี้ ฉันได้อัปเดตคำตอบของ @ TheHippo แล้ว แน่นอนถ้าคุณต้องการการสนับสนุน IE จริงๆคุณสามารถใช้transpiler ของ babel JavaScript

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


คำตอบที่ดี! เป็นไปได้ไหมที่จะส่งคืนพา ธ เช่น abc, abcd และอื่น ๆ สำหรับแต่ละคีย์ที่ถูกสำรวจ
supersan

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

เอนจิ้น Javascript ส่วนใหญ่ไม่ปรับการเรียกซ้ำแบบหาง (นี่อาจไม่เป็นปัญหาหาก 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
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

ฉันสร้างไลบรารีเพื่อสำรวจและแก้ไขออบเจกต์ JS ที่ซ้อนกัน ตรวจสอบ API ที่นี่: https://github.com/dominik791

นอกจากนี้คุณยังสามารถเล่นกับห้องสมุดแบบโต้ตอบโดยใช้แอพสาธิต: https://dominik791.github.io/obj-traverse-demo/

ตัวอย่างการใช้งาน: คุณควรมีวัตถุรูทซึ่งเป็นพารามิเตอร์แรกของแต่ละวิธี:

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

พารามิเตอร์ที่สองเป็นชื่อของคุณสมบัติที่เก็บวัตถุที่ซ้อนกันเสมอ 'children'ในกรณีดังกล่าวข้างต้นก็จะเป็น

พารามิเตอร์ที่สามคือวัตถุที่คุณใช้เพื่อค้นหาวัตถุ / วัตถุที่คุณต้องการค้นหา / แก้ไข / ลบ ตัวอย่างเช่นหากคุณกำลังมองหาวัตถุที่มี id เท่ากับ 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.