Как получить каждый объект на четырех уровнях вложенности объекта?

#javascript #arrays #object

#javascript #массивы #объект

Вопрос:

Я создаю объект, который включает в себя 3 объекта, один из которых включает в себя три объекта, и я хочу, чтобы каждый из них установил значение.

И я не знаю, нужно ли разделять тип объекта, кажется, все они являются объектами.

Я пытаюсь сделать так: пройти первый раз, чтобы распознать объект и массив, затем пройти дважды и в третий раз в depart, но консоль показывает ошибку.

> Невозможно установить свойство ‘www.google.com ‘
неопределенного типа ошибка: не удается установить свойство ‘www.google.com ‘ из неопределенных
при вычислении (userscript.html?name=
в Array.forEach ()

Исходный сценарий исключает четыре уровня вложенности объекта в инструмент поиска браузера

     Object.keys(iconsData).forEach(function(value1) {

        if(iconsData[value1].constructor === Array){
            iconsData[value1].forEach(function (value2) {
                console.log('typeArray--' iconsData[value1].constructor)
                value2.host.forEach(function(host) {
                    iconsData.hostCustomMap[host] = value2.custom     // The console shows an Error maybe here
                })
            })
        } else if (iconsData[value1].constructor === Object) {
            Object.keys(iconsData[value1]).forEach(function (value2) {
                console.log('typeObject--' iconsData[value1].constructor)
                iconsData[value1][value2].forEach(function (value3) {
                    value3.host.forEach(function(host){
                        iconsData.hostCustomMap[host] = value3.custom
                    });
                });
            });
        }
    })

 

Следующий код включает вложенный объект.

 (function () {
    'use strict';
    var keyword = {
        beforePopup: function (popup) {
            var text = window.getSelection().toString().trim();
            GM_setValue('search', text);
            popup(text);
        },
        beforeCustom: function (custom) {
            var text = GM_getValue('search');
            GM_setValue('search', '');
            custom(text);
        },

    };

var iconsData = {
    iconArraya: {
        Arraya: [
            {
                name: 'Google',
                image:'https://i.ibb.co/R9HMTyR/1-5.png',
                host: ['www.google.com'],
                popup: function (text) {
                open('https://search.google.com/live?keyword='   encodeURIComponent(text));
                }
            }
        ],
        Arrayb: [
            {
                name: 'Bing',
                image: 'https://i.ibb.co/pwkLTFc/1.png',
                host: ['www.bing.com'],
                popup: function (text) {
                open('https://www.bing.com/live?keyword='   encodeURIComponent(text)');
                }
            }
        ],
        Arrayc: [
            {
                name: 'Youtube',
                image:'https://i.ibb.co/FWVJ3Kf/1-2.png',
                host: ['www.youtube.com'],
                popup: function (text) {
                open('https://www.youtube.com/live?keyword='   encodeURIComponent(text)');
                }
            }
        ]
    },
    iconArrayb: [
        {
            name: 'open',
            image:'https://i.ibb.co/fxpm6Wc/image.png',
            host: [''],
            popup: function (text) {
                open(encodeURIComponent(text));
            }
        }
    ],
    iconArrayc: [
        {
            name: 'copy',
            image:'https://i.ibb.co/PQ5xM2R/2-1.png',
            host: [''],
            popup: function (text) {
                document.execCommand('copy', false, null))
            }
        }
    ],
    hostCustomMap: {}
    }


 

Ответ №1:

Невозможно установить свойство ‘www.google.com ‘ неопределенного типа ошибка: не удается установить свойство ‘www.google.com ‘ из неопределенных

Выдается ошибка, потому что hostCustomMap не является свойством iconsData .

В вашем коде вы устанавливаете переменную с именем hostcustommapв конце, это должно быть свойство объекта iconsData . Как в оригинальном скрипте.

Вот так:

 var iconsData = {
    iconArraya: ...,
    iconArrayb: ...,
    iconArrayc: ...,
    iconArrayD: ...,
    hostCustomMap: {}
}
 

Не это:

 var iconsData = {
    iconArraya: ...,
    iconArrayb: ...,
    iconArrayc: ...,
    iconArrayD: ...
}

var hostCustomMap = {}
 

Комментарии:

1. Да, я ошибаюсь, вывод hostCustomMap из объекта может уменьшить некоторые проблемы, он должен быть введен.