Подсчет количества свойств со значением typeof объекта в другом объекте - PullRequest
0 голосов
/ 25 апреля 2018

Я делал несколько итераций, чтобы получить определенное количество значений.

            $.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'){

                }
            })

Вы увидите, что у нас есть условие. В этом условии я проверяю те свойства "r", которые имеют значение typeof 'object'. Поэтому, если я выполню консольную проверку «r» внутри моего условного выражения, я на самом деле увижу эти конкретные свойства.

Итак, вот в чем дело. Почему я это делаю? Ну, я создаю переменную, которая будет хранить ТОЛЬКО те элементы "l", которые имеют дочернее свойство со значением "object" в качестве значения typeof. Это на самом деле работает, но проблема в том, что для моих целей мне нужна эта переменная не только для того, чтобы работать как задумано, но и для хранения только элементов, которые имеют свойство 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" объект, но также и то, сколько их у меня есть, и если они меньше единицы, поэтому мой журнал консоли не должен их вызывать.

Надеюсь, это достаточно ясно.

1 Ответ

0 голосов
/ 25 апреля 2018

Моя идея состоит в том, чтобы спроектировать что-то, что будет рекурсивным и не разрушит стек:

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

Вы предоставляете этой функции 2 вещи: объект для проверки и обратный вызов, который будет снабжен бухгалтерской книгой (массивом), которая будет списком объектов, который соответствует вашим критериям:

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 приведены ваши примеры, теперь я превращу ваш 1-й пример в пример, который будет принят:

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"]}
...