使用jQuery遍历嵌套对象

5

大家好,我正在尝试找到一种最动态的方法来循环遍历数组并返回特定值...JSON结构深层嵌套且可能发生变化,是否有$.each()公式可以帮助?

例:

var myobj = {
    obj1: { key1: 'val1', key2: 'val2' },
    obj2: { key1: '2val1', 
           key2: { nest1: 'val1', nest2: 'val2', nest3: 'val3' }, 
           key3: { nest1: 'K3val1', nest2: 'K3val2', 
                 nest3: [
                         { nest1: 'val1', nest2: 'val2', nest3: 'val3' }, 
                         { nest1: 'val1', nest2: 'val2', nest3: 'val3' }
                        ]
                 }
          },
    obj3: { key1: 'dddddval1', key2: 'val2' }
    }

现在假设我想检索“K3val2”的值,但是不想像这样硬编码:myobj.obj2.key3.nest2,我能否使用$.each()以动态方式执行此操作呢?


5
关键词:“递归”。现在是搜索谷歌的时候了。 - zerkms
那不是一个数组,它是一个带有一堆嵌套对象的对象。(它包含一个数组,即分配给nest3的数组。)(它也不是JSON,如标记的那样。) - T.J. Crowder
2
“深度结构化并且可能会改变”- 那么你如何知道要查找哪个键呢?您提供的唯一示例是询问如何查找特定的“值”,而不是与特定“键”相关联的值,那么...? - nnnnnn
如果你不知道值的位置,你想要如何“检索”该值?你如何识别已经找到它了?如果你想要搜索它,那么你应该已经知道这个值了... - Bergi
@nnnnnn 那将取决于我在特定时间必须提取的具体值,这意味着我会将其挂钩到触发器中。 - Simo D'lo Mafuxwana
1个回答

19
你可以简单地嵌套调用 $.each

实时例子 | 实时源代码

// Loop the top level
$.each(myobj, walker);

function walker(key, value) {
    // ...do what you like with `key` and `value`

    if (value !== null && typeof value === "object") {
        // Recurse into children
        $.each(value, walker);
    }
}

如果您想知道自己有多深,也可以这样做:

实时示例 | 实时源代码

var path = "";

// Loop the top level
$.each(myobj, walker);

function walker(key, value) {
    var savepath = path;

    path = path ? (path + "." + key) : key;

    // ...do what you like with `key` and `value`

    if (value !== null && typeof value === "object") {
        // Recurse into children
        $.each(value, walker);
    }

    path = savepath;
}

@T.J.Crowder 您的回答激发了我的灵感,谢谢。我遇到了一个问题,如果我有像这样的东西:{"Name": "Skipper The Penguin"}在第一层上。它会给出每个字母:s k i p p e r 和 so..将所有内容都包装成一个对象解决了这个问题。谢谢。 - Simo D'lo Mafuxwana
@D'loDeProjuicer:很高兴能帮到你。关于{"Name": "Skipper The Penguin"}的问题,上面的代码不会这样做,因为它在递归之前测试了值。这就是if (typeof value ===“object”)的作用。在这里查看它的实际效果:http://jsbin.com/ofifor/3([源](http://jsbin.com/ofifor/3/edit))。还要注意我之前漏掉了一个`null`检查,我已经添加了,你可能需要它。 - T.J. Crowder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接