Итерация и перечисление пар ключ-значение нескольких массивов в объекте

Мой вопрос касается следующей функции:

function loadConfigurations(configs){
  console.log(configs);
}

Объект «configs», который получает функция loadConfigurations, содержит два свойства — два массива, один из которых называется «назначенным», а другой — «неназначенным». И выполнение console.log(configs) выводит следующее:

"Object{assigned: Array[5], unassigned: Array[1]}"

Теперь я хочу перечислить пары ключ-значение каждого свойства как в «назначенном» массиве, так и в «неназначенном массиве».

Объект configs устроен следующим образом:

Извините, ребята. Это структура объектов конфигурации:

var configs = {
"config1":
        {
        "assigned": [
            {
                "name": "Admin Usersss",
                "value": "admin-user"
            },
            {
                "name": "MPR User",
                "value": "mpr-user"
            },
            {
                "name": "SAMHSA User",
                "value": "samhsa-user"
            }
         ],
        "unassigned": [
            {
                "name": "States User",
                "value": "states-user"
            },
            {
                "name": "All States User",
                "value": "all-states-user"
            },
            {
                "name": "Substance Abuse User",
                "value": "substance-abuse-user"
            }
         ]
        },
"config2":
        {
        "assigned": [
            {
                "name": "Admin User",
                "value": "admin-user"
            },
            {
                "name": "MPR User",
                "value": "mpr-user"
            },
            {
                "name": "SAMHSA User",
                "value": "samhsa-user"
            },
            {
                "name": "States User",
                "value": "states-user"
            },
            {
                "name": "All States User",
                "value": "all-states-user"
            }
        ],
        "unassigned": [
            {
                "name": "Substance Abuse User",
                "value": "substance-abuse-user"
            }
        ]
    },
    "config3":
    {
        "assigned": [
            {
                "name": "Admin User",
                "value": "admin-user"
            }
        ],
        "unassigned": [
            {
                "name": "States User",
                "value": "states-user"
            },
            {
                "name": "All States User",
                "value": "all-states-user"
            },
            {
                "name": "Substance Abuse User",
                "value": "substance-abuse-user"
            },
            {
                "name": "MPR User",
                "value": "mpr-user"
            },
            {
                "name": "SAMHSA User",
                "value": "samhsa-user"
            }
            ]
        }

Как мне это сделать?

Спасибо, см


person Chris Mazzochi    schedule 30.09.2016    source источник
comment
Во-первых, обратите внимание, что у вас есть два массива, а не пары ключ/значение. Чтобы добиться того, что вам нужно, вы можете использовать две петли, одну над configs.assigned, а другую над configs.unassigned.   -  person Rory McCrossan    schedule 30.09.2016
comment
Массивы на самом деле не имеют пар ключ-значение, только индексы с содержимым, но, возможно, configs.assigned.concat(configs.unassigned).forEach( (index, value) => ...   -  person adeneo    schedule 30.09.2016
comment
In each array there are key value pairs I want to get at. Этого не может быть, массивы не могут содержать ключи/значения. Было бы полезно, если бы вы могли опубликовать полное содержимое объекта вместо его консольного представления.   -  person Rory McCrossan    schedule 30.09.2016
comment
Извиняюсь. Да, каждый массив содержит объекты, которые содержат пары ключ-значение. И хорошо, я знаю, что у массивов есть индексы с содержимым.   -  person Chris Mazzochi    schedule 30.09.2016
comment
Я добавил для вас рабочий пример, который показывает, как перечислять ключи объекта.   -  person Rory McCrossan    schedule 30.09.2016


Ответы (3)


Учитывая структуру данных, которую вы опубликовали, вы можете использовать Object.keys() для перечисления ключей родительского объекта, а затем зацикливаться на свойствах assigned и unassigned внутри него. Попробуй это:

Object.keys(configs).forEach(function(key) {
    var config = configs[key];

    config.assigned.forEach(function(assigned) {
        console.log('A: ' + assigned.name + ', ' + assigned.value);
    });

    config.unassigned.forEach(function(assigned) {
        console.log('U: ' + assigned.name + ', ' + assigned.value);
    });
})

var configs = {
  "config1": {
    "assigned": [{
      "name": "Admin Usersss",
      "value": "admin-user"
    }, {
      "name": "MPR User",
      "value": "mpr-user"
    }, {
      "name": "SAMHSA User",
      "value": "samhsa-user"
    }],
    "unassigned": [{
      "name": "States User",
      "value": "states-user"
    }, {
      "name": "All States User",
      "value": "all-states-user"
    }, {
      "name": "Substance Abuse User",
      "value": "substance-abuse-user"
    }]
  },
  "config2": {
    "assigned": [{
      "name": "Admin User",
      "value": "admin-user"
    }, {
      "name": "MPR User",
      "value": "mpr-user"
    }, {
      "name": "SAMHSA User",
      "value": "samhsa-user"
    }, {
      "name": "States User",
      "value": "states-user"
    }, {
      "name": "All States User",
      "value": "all-states-user"
    }],
    "unassigned": [{
      "name": "Substance Abuse User",
      "value": "substance-abuse-user"
    }]
  },
  "config3": {
    "assigned": [{
      "name": "Admin User",
      "value": "admin-user"
    }],
    "unassigned": [{
      "name": "States User",
      "value": "states-user"
    }, {
      "name": "All States User",
      "value": "all-states-user"
    }, {
      "name": "Substance Abuse User",
      "value": "substance-abuse-user"
    }, {
      "name": "MPR User",
      "value": "mpr-user"
    }, {
      "name": "SAMHSA User",
      "value": "samhsa-user"
    }]
  }
}

Object.keys(configs).forEach(function(key) {
  var config = configs[key];
  config.assigned.forEach(function(assigned) {
    console.log(key + ' A: ' + assigned.name + ', ' + assigned.value);
  });
  config.unassigned.forEach(function(assigned) {
    console.log(key + ' U: ' + assigned.name + ', ' + assigned.value);
  });
})

Также обратите внимание, что (как указал @adeneo в комментариях к вашему вопросу), если вы выполняете одну и ту же логику для элементов assigned и unassigned, вы можете объединить их вместе и повторить их один раз.

Вышеупомянутый метод потребуется, если логика различается между свойствами.

person Rory McCrossan    schedule 30.09.2016
comment
Теперь, как взять имя и значение каждого из назначенных и неназначенных и заполнить элемент выбора параметрами, содержащими результаты, например: $('#shutle-dst').html('‹option value=value›name‹ /вариант>'); - person Chris Mazzochi; 30.09.2016
comment
Это совершенно отдельная цель, для которой вы должны начать новый вопрос. Хотя на аналогичный вопрос уже был дан ответ здесь: stackoverflow.com/questions/170986/ - person Rory McCrossan; 30.09.2016
comment
Это определенно сложная техника программирования, не так ли? Новичок или прав... - person Chris Mazzochi; 30.09.2016

Попробуй это:

if(configs.assigned != undefined && configs.assigned != null && configs.assigned.length > 0) {
         // LOOP
}

if(configs.unassigned != undefined && configs.unassigned != null && configs.unassigned.length > 0) {
     // LOOP
}

Проверьте здесь Javascript unassigned var?

person vvamondes    schedule 30.09.2016

Итерируйте ключи объектов, затем ключи этих объектов, затем массивы этих ключей:

for (var config in configs) {
    for (var configType in configs[config]) {
        for (var i = 0; i < configs[config][configType].length; i++) {
            var props = configs[config][configType][i];
            console.log(props);
        }
    }
}
person tymeJV    schedule 30.09.2016