【问题标题】:Counting how many properties with a typeof value of 'object' are inside another object计算 typeof 值为 'object' 的属性在另一个对象中的数量
【发布时间】:2018-10-06 09:05:19
【问题描述】:

我一直在进行一些迭代以获得一定数量的值。

            $.each(Obj, function(k,v){
                $.each(v, function(j,l){
                    $.each(l, function(r,s){
                        if(l.hasOwnProperty(r) && typeof s === 'object'){

                        }
                    })
                })
            }) 

在这段代码中,您会看到我正在迭代一个名为“Obj”的对象。在它里面我们会有一些数组和对象,因为它是一个非常复杂的结构。但是,让我们停止喋喋不休。一旦我们到达这部分......

           $.each(l, function(r,s){
                if(l.hasOwnProperty(r) && typeof s === 'object'){

                }
            })

你会看到我们有一个条件。在那个条件下,我正在检查那些 typeof 值为“object”的属性“r”。所以,如果我在我的条件中对“r”进行控制台检查,我实际上会看到那些特定的属性。

所以,事情就是这样。我为什么要这样做?好吧,我正在构建一个变量,该变量将仅存储那些具有“object”作为 typeof 值的子属性的“l”元素。这实际上是可行的,但问题是,就我的目的而言,我不仅需要此变量按预期工作,而且还需要仅存储具有 MORE THAN ONE 属性并将 'object' 作为 typeof 值的元素。

那么,让我们考虑一下这种情况:

如果我有两个像下面这样的对象...

Obj1: [{"key":"value", "key":"value", "key":"[{"key":"value", "key":"value"}, { "key":"value", "key":"value"}]"}]

Obj1: [{"key":"value", "key":"value", "key":"[{"key":"value", "key":"value"}, { "key":"value", "key":"value"}]", "key":"[{"key":"value", "key":"value"}, { "key":"value", "key":"value"}]"}]

我希望我的变量只存储第二个,因为它有 2 个值,其中包含对象。

所以,在我的条件中,我想使用某种逻辑,不仅让我知道我的“l”元素内部是否有一个对象,而且我有多少个对象,以及它们是否'小于一个,那么我的控制台日志不应该显示它们。

希望它足够清楚。

【问题讨论】:

    标签: javascript arrays object iteration each


    【解决方案1】:

    我的想法是设计一些可以递归且不会爆栈的东西:

        function inspect (obj,f,e,ledger) {
    /*obj is the object to inspect,
    f is the call back,
    e is an internal reference to setTimeout,
    ledger is the array that will be populated*/
                    var ledger = ledger || [],
                        probObjCount = 0;
                    f = f || false,
                    e && e.value ? clearTimeout(e.value) : void(0);
                    e = e || {};
                    e.value = setTimeout(function(){f && f.call(ledger,ledger);},50);
                    if(obj instanceof Array){
                        obj.forEach(function(d,i){
                            (typeof d === "object") && window.requestAnimationFrame(function(){
                                inspect(d,f,e,ledger);
                            })
                        })
                        return;
                    }
                    for (var i in obj) {
                        if(!obj.hasOwnProperty(i)){
                            continue;
                        }
                        if(typeof obj[i] === "object") {
                            ++probObjCount;
                            !function(obj){
                                window.requestAnimationFrame(function(){
                                    inspect(obj,f,e,ledger);
                                })
                            }(obj[i]);
                        }
                    }
                    if(probObjCount >= 2){
                        ledger.push(obj);
                    }
                }
    

    您为这个函数提供两件事,一个要检查的对象和一个回调,该回调将提供一个分类帐(一个数组),该分类帐将是符合您条件的对象列表:

    var x = [{"key1":"value", "key2":"value", "key3":[{"key4":"value", "key5":"value"}, { "key6":"value", "key7":"value"}]}];
    inspect(x,function(l){console.log(l)});
    //after a few seconds:
    //[]
    
    var x = [{"key1":"value", "key2":"value", "key3":[{"key4":"value", "key5":"value"}, { "key6":"value", "key7":"value"}], "key8":[{"key9":"value", "key10":"value"}, { "key11":"value", "key12":"value"}]}]
    inspect(x,function(l){console.log(l)});
    //[{…}]
    

    以上2个是你的例子,现在我会把你的第一个例子变成一个可以接受的例子:

    var x = [{"key1":"value", "key2":"value", "key3":[{"key4":["value"], "key5":["value"]}, { "key6":"value", "key7":"value"}]}]
    inspect(x,function(l){console.log(l)});
    //[{…}] you will get {"key4":["value"], "key5":["value"]}
    

    【讨论】:

    • 效果非常好!谢谢,我已经烧了几个小时了。
    猜你喜欢
    • 2017-06-07
    • 2011-07-25
    • 2021-12-31
    • 2012-01-03
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多